php面向对象程序设计中self与static的区别分析
本文实例讲述了php面向对象程序设计中self与static的区别。分享给大家供大家参考,具体如下
1、假设我们有个Car类,它有2个方法model()
和getModel()
。
class Car{ public function model(){ //这里我们使用了关键字self self::getModel(); } protected function getModel(){ echo 'I am car'; } }
实例化后调用方法
$car = new Car(); $car->model(); // 输出I am car
关键字self使得我们调用了Car类的getModel()方法,输出了文本“I am car”。
2、添加一个新类作为Car类的子类
class Mercedes extends Car { protected function getModel() { echo "I am mercedes"; } } // 实例化后 调用model()方法 $mercedes = new Mercedes(); $mercedes->model();
我们知道子类会继承父类的方法,我们在子类Mercedes中重写了getModel()方法。
这时候实例化Mercedes类调用model()方法,会输出字符串"I am car" 还是“I am mercedes”?
你可能会觉得结果是I am mercedes。
但实际输出是
I am car
why?
3、关键字self的工作原理是它会调用当前类的方法。
因为model()
方法只在Car类中定义的,所以对self来说当前类就是Car类。self::getModel()
就是调用Car类中的getModel方法。
这似乎不是我们想要的,如何解决呢?
4、解决方案一在Mercedes类中覆盖model()
方法
class Mercedes extends Car { public function model(){ //这里我们使用了关键字self self::getModel(); } protected function getModel() { echo "I am mercedes"; } } // 实例化后 调用model()方法 $mercedes = new Mercedes(); $mercedes->model(); // 输出I am mercedes
但这肯定不是好办法啊,方法都重写了,还继承个毛啊。
5、解决方案二把self关键字换成static
class Car{ public function model(){ //这里我们使用了关键字static static::getModel(); } protected function getModel(){ echo 'I am car'; } }
我们只是将Car类中的self替换成了static,并未对Mercedes类作修改。
此时我们调用
$mercedes = new Mercedes(); $mercedes->model(); // 输出I am mercedes
6、小结
在php5.3中加入了一个新特性,叫做延迟静态绑定。可以帮我们实现多态。
简单说,延迟静态绑定意味着,当我们使用static关键字调用一个继承方法时,它将在运行时才绑定调用类。
更多关于PHP相关内容感兴趣的读者可查看本站专题《》、《》、《》、《》、《》、《》及《》
希望本文所述对大家PHP程序设计有所帮助。
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程