PHP在访问类方法方面的差异

PHP在访问类方法方面的差异,php,class,methods,Php,Class,Methods,$foo->bar()和$foo::bar()之间有什么区别?$foo::bar()是对静态方法bar()的调用,这意味着对象$foo不是由\uu construct()方法实例化的 调用$foo->bar()时,必须先实例化对象$foo!例如: $foo = new Foo; // internally the method __constuct() is called in the Foo class! echo $foo->bar(); 通常,您不会像在您的示例($foo)中那样

$foo->bar()
$foo::bar()
之间有什么区别?

$foo::bar()
是对静态方法
bar()
的调用,这意味着对象
$foo
不是由
\uu construct()
方法实例化的

调用
$foo->bar()
时,必须先实例化对象
$foo
!例如:

$foo = new Foo; // internally the method __constuct() is called in the Foo class!
echo $foo->bar(); 
通常,您不会像在您的示例(
$foo
)中那样对现有对象调用静态方法,您可以直接在类foo上调用它:

 Foo::bar();
第一个

$foo->bar();
调用(对象)方法,而

Foo::bar();
您可以调用类(静态)方法

可以对对象调用类方法。这就是您的第二个示例所做的。那么这个

$foo = new Foo;
$foo::bar();
与相同

Foo::bar();
甚至

$classname = get_class($foo);
$classname::bar();
更新: 错过了什么
$foo
也可以是带有类名的字符串

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

阅读更多关于static@mable duplicate of(related)-1:我很抱歉投反对票,但是对对象调用static方法会导致PHP发出通知,这可能意味着代码不完全正确。依我拙见,这是一种很多人都认为是理所当然的做法。我说这是可能的,但不是一个好主意。然后,这正是提问者想要知道的。它也不会在PHP5.3及更高版本上发布通知。然而,我同意,这不是很好的做法。(好吧,也许我忘了,
$foo
也可以是字符串^^^)应该“这意味着对象$foo没有通过_construct()方法实例化。”是什么意思?如果不调用
\uuu construct()
,则不可能实例化对象:?在@KingCrunch,如果没有定义\uu construct方法,则可以在不(自动)调用\uu construct()的情况下实例化对象。但是这没有多大意义,在这种情况下,您可以选择以静态方式调用所有其他方法。