php中self和static有什么区别
这篇文章将为大家详细讲解有关php中self和static有什么区别,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
PHP开发环境搭建工具有哪些
一、phpStudy,是一个新手入门最常用的开发环境。二、WampServer,WampServer也同样的也是和phpStudy一样操作简单对小白比较友好。三、XAMPP,XAMPP(Apache+MySQL+PHP+PERL)是一个功能强大的建站集成软件包;四、MAMP,MAMP分为两种MAMP和MAMP Pro for Mac。五、宝塔面板,宝塔面板是一款服务器管理软件,支持windows和linux系统。六、UPUPW,UPUPW是目前Windows平台下最具特色的Web服务器PHP套件。
php中self和static的区别:self只能引用当前类(current class)中的方法,而static允许函数调用在运行时绑定调用类(calling class)中的方法。
本教程操作环境:windows7系统、PHP7.1版,DELL G3电脑
php中self与static的区别
通过一些示例,我们可以很容易看出self和static的区别。假定我们有class Car – 它有两个方法,model和getModel。注意,这里我们使用了关键字self。
class Car{ public static function model() { self::getModel(); } protected static function getModel() { echo "I am a Car!"; }}
调用静态方法
Car::model();
得到输出
I am a Car!
关键字self使得我们调用了class Car的getModel方法,输出了文本“I am a Car!”。
下面我们添加一个新的类,class Mercedes, 它继承自class Car,代码如下:
class Mercedes extends Car{ protected static function getModel() { echo "I am a Mercedes!"; }}
当我们调用Mercedes::model()时,猜猜结果是什么?
可能你觉得结果会是:
I am a Mercedes!
但实际输出是:
I am a Car!
这是为什么呢?
对于self的解释
关键字“self”的工作原理是:它会调用当前类(current class)的方法。因为model方法只在class Car中定义的,所以对它来说当前类就是class Car。model中的self::getModel(),调用的自然也就是class Car中的getModel方法。
这个行为似乎不是我们想要的,它不符合面向对象的设计原则。如何解决呢?可以使用关键字static。
static关键字和延迟静态绑定(late static binding)
在PHP5.3中,加入了一个新的特性,叫做延迟静态绑定。它可以帮我们实现多态,解决上面的问题。简单来说,延迟静态绑定意味着,当我们用static关键字调用一个继承方法时,它将在运行时绑定调用类(calling class)。在上面的例子中,如果我们使用延迟静态绑定(static),意味当我们调用“Mercedes::model();”时,class Mercedes中的getModel方法将会被调用。因为Mercedes是我们的调用类。
延迟绑定的例子
class Car{ public static function model() { static::getModel(); } protected static function getModel() { echo "I am a Car!"; }}
我们只是将class Car中的self替换成了static,并未对class Mercedes作修改。
现在我们调用
Mercedes::model();
得到输出
I am a Mercedes!
php 5.3以下的版本无法使用延迟静态绑定
注意,php 5.3之前的版本无法使用延迟静态绑定。如果尝试在php 5.3以下的版本运行上面的例子,将会报错。
php中的self和static
现在我们将例子中的self用static替换,可以看到,两者的区别在于:self引用的是当前类(current class)中的方法,而static允许函数调用在运行时绑定调用类(calling class)中的方法。
关于“php中self和static有什么区别”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341