如果$new->sound();
触发对非对象上的成员函数的调用,则意味着您正试图在非对象 ( sound()
) 上调用成员函数 ( $new
)。这是真正的问题,它不能由您发布的代码触发。我很确定您在真实代码中遇到了该错误,但您发布了一个不会重现该问题的简化版本。
您发布的简化代码应该可以正常工作,除了它当然不打印或使用返回值。稍微修正一下,我们可以看到调用静态方法的两种方式都是有效的:
<?php
error_reporting(-1);
class Dog{
public static function sound(){
$bark = "WOOF!";
return $bark;
}
}
$new = new Dog();
echo Dog::sound();
echo $new->sound();
看到它在行动。
该手册可能没有明确说明,但隐含地确认可以做到:
将类属性或方法声明为静态使它们无需实例化即可访问。
[...]
因为静态方法可以在没有创建对象实例的情况下调用,所以伪变量 $this 在声明为静态的方法中不可用。
不强制不等于被禁止。
不能使用箭头运算符通过对象访问静态属性->
。
属性,而不是方法。
静态调用非静态方法会生成 E_STRICT 级别的警告。
这是相反的事情,这被明确记录为不允许