class Duck {
public function quack() {
$this->swim();
}
public function swim() {
echo 'I\'m swimming!';
}
}
class Plane {
public function fly() {
Duck::quack();
}
public function swim()
{
echo 'I can\'t swim! People are DROWNING!';
}
}
$plane = new Plane();
$plane->fly();
我被问到上面的问题,并给出了输出是非法调用静态方法的错误的答案 但它实际上印有“我在游泳!” 有人可以解释为什么会这样吗?
答案 0 :(得分:2)
默认情况下有效,但如果您启用E_STRICT
,则会获得
PHP Strict Standards: Non-static method Duck::quack() should not be called statically in...
PHP看到你希望swim()
实际上是静态的,所以你只需要调用它。
答案 1 :(得分:0)
PHP 5.3 (以及公共方法)需要注意的事项:
CAN 从INSIDE对象上下文中静态调用公共方法(仅当在实例化对象内部时)...即使未声明为静态
Duck::quack();
CANT 在同一场景中调用受保护的方法。
Duck::quack(); //error
protected function quack() { }
CANT 从INSIDE对象上下文中静态调用公共属性(实例变量),除非声明为static ...
class Duck {
public $hello = 'hello there';
}
class Plane {
Duck::$hello; //error
}
CANT 从OUTSIDE对象上下文静态调用公共方法(或属性)..无声明静态
Duck::quack(); //error
其他语言使用这种类型的引擎灵活性,只要从Object上下文中静态调用任何公共方法
如上所述(@poitroae)默认情况下它的工作原理如下,但是如果你打开E_STRICT
就会出错。
同时强>
这是PHP的一个已知特性,你不应该被允许在这个上下文中调用$this
。此时程序应该在Class Context下(静态调用),但是$this
的工作类似于Object Context。
如果这是静态声明的方法,则调用$this
会导致即时致命错误。
希望有所帮助