非静态方法可以调用静态方法,静态方法不可以调用非静态方法!
原因如下:
静态方法是属于类的,即静态方法是随着类的加载而加载的,在加载类时,程序就会为静态方法分配内存。
非静态方法是属于对象的,对象是在类加载之后创建的。
也就是说静态方法先于对象存在,当你创建一个对象时,程序为其分配内存,一般是通过this指针来指向该对象。静态方法不依赖于对象的调用,它是通过‘类名.静态方法名’这样的方式来调用的。而对于非静态方法,在对象创建的时候程序才会为其分配内存,然后通过类的对象去访问非静态方法。
因此,在对象未存在时非静态方法也不存在,静态方法自然不能调用一个不存在的方法。
有人建议使用(new self())->func();该方法待测试:
class Test {
public function func () {
return 'hello' ;
}
public static function action () {
// 如何调用 func 方法 ?
return (new self())->func();
}
}