Php static的奇怪之处::调用包含$this的方法

Php static的奇怪之处::调用包含$this的方法,php,static,this,self,Php,Static,This,Self,在本例中,我得到了预期的致命错误“致命错误:不在对象上下文中使用$this” class ctis_parent{ public function objFunc(){ var_dump('Called succes'); } public static function call(){ $this->objFunc(); } public function __construct(){ sel

在本例中,我得到了预期的致命错误“致命错误:不在对象上下文中使用$this”

class ctis_parent{
    public function objFunc(){
        var_dump('Called succes');
    }

    public static function call(){

        $this->objFunc(); 
    }

    public function __construct(){
        self::call();
    }

}

new ctis_parent();
但若从call()方法的定义中删除static关键字都能正常工作,为什么

class ctis_parent{
    public function objFunc(){
        var_dump('Called succes');
    }

    public  function call(){
        $this->objFunc();
    }

    public function __construct(){
        self::call();
    }

}

new ctis_parent(); 

//string 'Called succes' (length=13)

因为您不在对象中时正在使用
$this
。嗯,你不是真的,但是通过静态声明,人们可以:

ctis_parent::call();
其中,
$this
将是非法的


请参阅。

,因为您不在对象中时正在使用
$this
。嗯,你不是真的,但是通过静态声明,人们可以:

ctis_parent::call();
其中,
$this
将是非法的


请参阅。

根据定义,静态函数不需要实例化类,因此它无权访问指向当前实例的
$this->
引用。如果实例不存在,则无法指向它。有道理

根据定义,静态函数不需要实例化类,因此它无权访问指向当前实例的
$this->
引用。如果实例不存在,则无法指向它。有道理

我知道我在错误的上下文中使用了static,但为什么在第二个示例中它会起作用?@yurisnk:为什么它不应该起作用?在神奇地调用构造函数之后,$this存在,您正在调用它的函数objFunc()@yurisnk:当您从构造函数调用时,您是从一个只能在创建新实例时调用的方法调用的,因此有一个
$this
,并调用一个方法(您没有声明为静态的)从实例内部静态地fine@elias-van ootegem这意味着当我们使用static::关键字调用非静态方法时,这相当于使用$this->调用?是的,但
是所谓的范围解析运算符,所以
self::call()
仅表示在
self::
范围内调用函数
call
。总的来说,为了避免混淆,最好将其留给静力学使用。看到
self::nonstaticMethod()
有效,我感到相当惊讶。我以为它不再有用了……我知道我在错误的上下文中使用了static,但为什么在第二个示例中它会起作用?@yurisnk:为什么它不应该起作用?在神奇地调用构造函数之后,$this存在,您正在调用它的函数objFunc()@yurisnk:当您从构造函数调用时,您是从一个只能在创建新实例时调用的方法调用的,因此有一个
$this
,并调用一个方法(您没有声明为静态的)从实例内部静态地fine@elias-van ootegem这意味着当我们使用static::关键字调用非静态方法时,这相当于使用$this->调用?是的,但
是所谓的范围解析运算符,所以
self::call()
仅表示在
self::
范围内调用函数
call
。总的来说,为了避免混淆,最好将其留给静力学使用。看到
self::nonstaticMethod()
有效,我感到相当惊讶。我以为它不再是了。。。