2011-02-24 61 views
3

$foo->bar()$foo::bar()有什么区别?访问类方法的PHP区别

+2

了解更多关于静态@ http://php.net/manual/en/language.oop5.static.php – MatejB 2011-02-24 13:58:55

+1

可能重复的[在PHP中,什么之间::和区别? - >]( http://stackoverflow.com/questions/3173501/in-php-whats-the-difference-between-and) – Gordon 2011-02-24 14:16:03

+0

*(相关)* [参考:什么是符号在PHP中的意思](http://stackoverflow.com/questions/3737139/reference-what-does-this-symbol-mean-in-php) – Gordon 2011-02-24 14:16:55

回答

4

$foo::bar()是静态方法bar()的调用,这意味着对象$foo没有通过__construct()方法实例化。

当致电$foo->bar()时,对象$foo必须在实例化之前!例如:

$foo = new Foo; // internally the method __constuct() is called in the Foo class! 
echo $foo->bar(); 

通常你不你例如调用一个现有的对象上的静态方法等($foo),可以调用它直接在类Foo:

+0

“这意味着对象$ foo不会被__construct()方法实例化。”意思?它不可能在不调用'__construct()'的情况下实例化对象:? – KingCrunch 2011-02-24 14:19:36

+0

在@KingCrunch中,当没有定义__construct方法时,可以实例化一个没有(自动)调用__construct()的对象。但是这并没有多大意义,在这种情况下,你会选择以静态方式调用所有其他方法。 – powtac 2011-02-24 14:22:22

0

随着第一一个

$foo->bar(); 

调用(对象)的方法,而用

Foo::bar(); 

你可以调用类(静态)方法。

它可能调用对象的类方法。也就是说,你的第二个例子做了什么。因此,这

$foo = new Foo; 
$foo::bar(); 

是相同的

Foo::bar(); 

甚至

$classname = get_class($foo); 
$classname::bar(); 

更新: 错过了什么 $foo也可以只是与类名的字符串。

$foo = 'Baz'; 
$foo::bar(); // Baz::bar(); 
+0

-1:我很抱歉downvote,但调用对象的静态方法会导致PHP吐出通知,可以说这意味着代码不完全正确。根据我的愚见,这是许多人不幸认为理所当然的做法。 – Christian 2011-02-24 14:03:19

+0

我说过它可能,这不是一个好主意。然后,确切地说,提问者想知道什么。而且它不会再使用PHP5.3及以上版本发布通知。但是,我同意,那不是很好的做法。 (好的,也许我忘了,'$ foo'也可以是一个字符串^^) – KingCrunch 2011-02-24 14:16:21