【发布时间】:2011-02-24 13:56:40
【问题描述】:
$foo->bar() 和 $foo::bar() 有什么区别?
【问题讨论】:
$foo->bar() 和 $foo::bar() 有什么区别?
【问题讨论】:
$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 类上调用它:
Foo::bar();
【讨论】:
__construct() 就不可能实例化对象:?
第一个
$foo->bar();
你调用(对象)方法,而用
Foo::bar();
你调用类(静态)方法。
可以在对象上调用类方法。也就是说,你的第二个例子是做什么的。所以这个
$foo = new Foo;
$foo::bar();
等同于
Foo::bar();
甚至
$classname = get_class($foo);
$classname::bar();
更新:
错过了什么
$foo 也可以只是一个带有类名的字符串。
$foo = 'Baz';
$foo::bar(); // Baz::bar();
【讨论】:
$foo 也可以是字符串^^)