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面向对象程序设计入门教程》、《php数组(array)操作技巧大全》、《php基本语法入门教程》、《php运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家php程序设计有所帮助。
推荐阅读
-
php面向对象中static静态属性与方法的内存位置分析
-
PHP面向对象程序设计中的self、static、parent关键字用法分析
-
PHP中static关键字以及与self关键字的区别
-
php类中static与self的使用区别浅析
-
php面向对象程序设计中self与static的区别分析
-
PHP中new static()与new self()的区别异同分析
-
php面向对象中static静态属性与方法的内存位置分析,面向对象static_PHP教程
-
php面向对象类中的$this,static,final,const,self这几个关键字使用方法。
-
PHP中static关键字以及与self关键字的区别
-
php面向对象编程self和static的区别 matlab面向对象编程 c#面向对象编程思想 面向对象编程语