php中self和static的区别:self只能引用当前类(current class)中的方法,而static允许函数调用在运行时绑定调用类(calling class)中的方法。

本教程操作环境:windows7系统、PHP7.1版,DELL G3电脑

php中self与static的区别

通过一些示例,我们可以很容易看出self和static的区别。假定我们有class Car – 它有两个方法,model和gA 0 ~ ~etModel。注意,这里我们使用了关键字self。

class Car
{
public static function model()
{
self::getModel();
}
pr` R } notected s. 7 a M { - \ : (tatic functioi l / /n 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{
protectM 4 f a bed static function getModel()
{
echo "I amz k ! ; ] K a Mercedes!";
}
}

当我们调用Mercedes:) k : 1:model()时,猜猜结果是什么?
W s K g O能你觉得结果会是:

I am a MercedesT o [ 5 4 o!

但实际输出是:

I am ag x r % Car!

这是为什么呢?

对于self的解释

关键字“self”的工作原理是:它会调用当前类(curj # M Q : ? Urent clasm N T 1 n 8 6s)的方法。因为model方法只在class Car中定义的,所以对它来说当前类就是class Car。model中的self::getModel(),调用的自然也就是class Car中的getModel方法。

这个行为似乎不是我们想要的,它不符合面向对象的设计原则。如何解决呢?可以使用关键字static。

static关键字和延迟静态. . m a # R =绑定{ O * _(late static binding)

在PHP5.3中,加入了一个新的特性,叫做延迟静态绑定。它可以帮我们实现多态,解决上面的问题。简单来说,延迟静态绑定意味着,当我们用static关键字调用一个继承方法时,它将在运行时绑定调用类(calling clas) $ Fs)。在上面的例子中,如果我们使用延迟静态绑定(static),意味当我们调用“Mercedes::model();”时,class MerW X ] w ) ~ l N rcedes中的getModel方法将会被调用。因为Mercedes是我们的调用类

延迟绑定的例子

class Car{
public static function model()
{w Q Y } K
static::getModel();
}    protected static function getModel()
{
echo "I am a Car!";
}
}

我们只是将classG 6 . A | o F Car中的self替换成了static,并未对class Mercedesc o d S 2 ^ T w S作修改。

现在我们调用

Mer, O L Wcedes::model()H W v;

得到输出

I am a Mercer q ) N , ~ q ? {des!

php 5.3以下的版本无法使用延迟静态绑定

注意,php 5.3之前的版本无法使用延迟静态绑定。如果尝试在php 5.3以下的版本运行上面的例子,将会报错。

php中的self和static

现在我们将例子中的t * Aself用static替换,可以看到,两者的区别在于:self引用的是当前类(current class)中的方法,而static允许函数调用在运行时绑定调用类(calling class)中的方法。

推荐学习:《PHP视频教程》

以上就是php中self和static的区别是什么的详细内容,更P x g 2 = . d多请关& @ x #注php中文网其它相关_ T 4 } :文章!

php中文网最新课程二维码

声明:本文原f i 9 f U + }创发布php中文网,转载请注明出处,感谢您Z % G p { ?的尊重!如有疑问,请联系admin@php.cnd / Z q % v处理

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注