为什么在这个例子中对非静态方法的'self'调用有效?
class A{
protected function aNonStaticMethod(){
return __class__;
}
public function aEcho(){
echo self::aNonStaticMethod();
}
}
感谢您的解释。
答案 0 :(得分:7)
在你的简单例子中,$ this和self是可互换的。但是要注意处理继承时解决的不同方法(我为完整性添加了静态):
class A {
protected function aNonStaticMethod(){
return __class__;
}
public function selfEcho(){
echo self::aNonStaticMethod();
}
public function staticEcho(){
echo static::aNonStaticMethod();
}
public function thisEcho(){
echo $this->aNonStaticMethod();
}
}
class B extends A {
protected function aNonStaticMethod(){
return __class__;
}
}
$b = new B();
$b->selfEcho(); // A
$b->staticEcho(); // B
$b->thisEcho(); // B
答案 1 :(得分:4)
理论上它应不有效,但正如this评论所说:
php4中没有静态关键字,但php4确实允许静态 调用。为了保持向后兼容性,这是留在了 在php5中添加了static keyword。
this官方php.net wiki:
支持此评论如果从实例方法进行调用,则已弃用。 不将方法注释为静态是一种过时的PHP4-ism。
你真的不应该静态地调用非静态方法 - 它没有意义(如果有 static
关键字)。
...因为a)这是一个糟糕的方法,b)PHP docs说:
<强>注意强>
在PHP 5中,静态调用非静态方法会生成E_STRICT级别警告。
和
警告强>
在PHP 7中,不推荐静态调用非静态方法,并将生成E_DEPRECATED警告。将来可能会删除对静态调用非静态方法的支持。
::
运算符进行非静态调用 - 可能是一种很好的方法!正如@Kontrollfreak所指出的那样,this docs表示::
运算符不仅限于静态调用:
双冒号,是一个允许访问静态,常量, 和重写的属性或类的方法
因此,如果您通过这种方式引用父类中的一个或多个属性 - 这是不限直接父级,则可以。