[英]Why does PHP assigns context to a static method call and does not give an E_STRICT notice?
我在PHP5.4(在5.5中也出現)中遇到了一些非常奇怪的行為。 基本上,我是靜態地調用一個非靜態方法,並且我沒有得到我肯定應該得到的E_STRICT錯誤。
<?php
error_reporting(E_ALL);
class A
{
public function iAmNotStatic() {}
}
現在,如果我這樣做:
A::iAmNotStatic();
然后,我得到了預期的Strict standards: Non-static method A::iAmNotStatic() should not be called statically
錯誤Strict standards: Non-static method A::iAmNotStatic() should not be called statically
。
而且,如果我從對象上下文進行調用,也會收到相同的錯誤(如預期的那樣)
class B
{
public function __construct() {
A::iAmNotStatic();
}
}
$b = new B(); // error here, as expected
但是,如果我這樣做(將A指派為B的父母):
class B extends A
{
public function __construct() {
A::iAmNotStatic();
}
}
$b = new B(); // no error
然后PHP決定“沒問題,我有一個具有相同父類(A)的對象($ b),讓我們將其作為iAmNotStatic
的上下文”。
那么,這是一個功能還是一個錯誤,這種令人困惑的(未記錄的)行為的目的可能是什么? 謝謝 :)
在第一種情況下,您沒有對象上下文,因為您是從外層空間調用非靜態方法的。 但是在第二種情況下,您具有對象上下文,因為$this
將引用B
實例-因此,PHP將發現對象上下文存在,因此,它是非靜態方法的非靜態調用(所有內容都是好)。 如果您對通過::
呼叫猶豫不決,那么我想,您應該提醒一下,例如parent::method()
是有效的呼叫。 即引用方式不是這里的問題。
更加具體:
class A
{
public function foo()
{
echo('foo called, class: '. get_class($this).PHP_EOL);
}
}
class B extends A
{
public function __construct()
{
A::foo();
}
}
$b=new B(); //foo called, class: B
因此自foo()
繼承以來,您將按預期看到類B
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.