由于您声明您已经了解static
的含义,因此我会跳过该说明。
但是,引用PHP的documentation on the static
keyword可能仍然很好。特别是以下两个警报很重要(真的很难看清楚)。
注意 在PHP 5,调用非静态方法静态生成E_STRICT级警告。
而这一个(斜体强调我的)。
警告 在PHP 7,调用非静态方法静态已过时,会产生E_DEPRECATED警告。 支持静态调用非静态方法将来可能会被删除。
因此,削减长话短说:是的,你的榜样将运行(现在),因为PHP解释器将尝试修复你的错误你。你应该永远不要这样做。 PHP解释器将做什么是:
说你的$obj
是Foo
类型。然后,它会读取
$obj->staticMethod($para1, $para2);
断定staticMethod
是static
,而是执行
Foo::staticMethod($para1, $para2);
这当然是完全正常的通过,是Foo
实例的性能参数。 staticMethod
参数来自哪里并不重要。
更详细地说明了一下,为什么这个作品,而在static
方法使用$this
是不允许的。
您可以将常规方法看作static
函数,它们有一个额外的功能:它们收到一个隐式参数$this
。 $this
的值仅仅是调用该方法的对象。因此,$obj->do($a, $b, $c)
相当于拨打Foo::do($obj, $a, $b, $c)
并命名为do
,$this
的第一个参数。这很方便,因为我们现在可以轻松定义在对象实例上工作的方法,而无需一遍又一遍地重复说明此实例是我们方法的参数。大。
现在回到static
的功能。与普通方法唯一的区别是它们不会收到这个隐含的$this
参数。因此,在他们里面使用$this
是无效的。不是因为它被禁止,而是因为它没有引用任何东西。 PHP没有(也不能)知道$this
应该指向什么。
另一种方法来看看它。说我们的Foo
类有两个属性:$para1
和$para2
,两个数字。假设你写了一个方法返回这些数字的总和。一种方法是做到这一点:
public static function sum($para1, $para2) {
return $para1 + $para2;
}
很好。作品。然而,它是这样称呼它是讨厌的
$sum = Foo::sum($obj->para1, $obj->para2);
所以,这是什么方法是!
public function sum(/* implicit $this parameter */) {
// write looking up the properties once inside the function, instead
// of having to write it every time we call the function!
return $this->para1 + $this->para2;
}
// ...
$sum = $obj->sum(); // $obj is passed implicitly as $this
因为静态函数不接受隐$this
参数,使用$this
它们的内部就像是试图使用$undefined
当你从来没有定义它。因此,无效。
密切相关:[如果我以非静态方式调用静态方法?](// stackoverflow.com/q/12874376/962603) –
将静态方法看作是使用时髦句法。类静态成员也是如此。唯一使它们与全局对象(函数,变量)不同的是可见性说明符(protected,private)。 – axiac