2011-10-01 111 views
1

这是如何工作的?不应该这会抛出一个错误,因为我试图静态调用一个非静态方法?基本上,我从来没有实例化一个类型的东西的对象。PHP静态调用方法;即使其未定义为静态

class Something { 
    public function helloworld() { 
     echo 'hello world'; 
    } 
} 

Something::helloworld(); 
+0

没什么特别的,只是'$ this = null'。 –

+0

[PHP:通过ClassName ::方法语法调用实例方法,导致静态调用?]的可能重复(http://stackoverflow.com/questions/4664511/php-call-to-an-instance-method -via-classnamemethod-syntax-results-in-a-static) – Gordon

回答

1

将这个在你的脚本的顶部:

error_reporting(E_ALL | E_STRICT); // E_STRICT is important here 
ini_set('display_errors', true); 

...看到那么会发生什么:

严格的标准:非静态方法::东西的HelloWorld()不应该 可以在[...]

不可否认,它比一个错误的通知,虽然静态调用。你的脚本将继续愉快地继续运行。

0

它只会给你一个错误,如果内helloworld()你会使用$this

这是一种由于缺少规格而导致的PHP“WTF”类型,它允许您静态调用一个实际上没有声明的函数static

+0

IIRC,它不是一个丢失的规范,它只是向后兼容PHP 4. – hakre

+0

...没有规格。 –

+0

嗯,它不是逐字写出来的,但是如果你阅读[PHP 5 docs](http://www.php.net/manual/en/language.oop5.static.php),那么清楚地写出未指定就像上市。而在PHP 4中,公共函数可以静态调用。所以实际上它被记录下来,甚至在静态章节中。另请参阅:http://php.syntaxerrors.info/index.php?title=Call_to_undefined_function#NOTE:_Static_methods_in_PHP4 - 仅供参考,通常情况下,您不应该再关心PHP 4。 – hakre