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视频教程》
以上就是php中self和static的区别是什么的详细内容。