【问题标题】:Oddity of static:: calling a method that contains $this奇怪的 static:: 调用包含 $this 的方法
【发布时间】:2012-09-06 20:46:14
【问题描述】:

在这个例子中,我得到了致命错误“致命错误:不在对象上下文中使用 $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)

【问题讨论】:

    标签: php static this self


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      因为您不在对象中时使用的是$this。好吧,你不是真的,但是使用静态声明,人们可以这样做:

      ctis_parent::call();
      

      在哪里,$this 是非法的。

      请参阅docs for static

      【讨论】:

      • 我知道我在错误的上下文中使用了 static 但为什么在第二个示例中它可以工作?
      • @yurisnk:为什么它不能工作?构造函数被神奇调用后,$this 存在,你调用的是函数 objFunc();
      • @yurisnk:当你从构造函数调用时,你调用的方法只能在创建新实例时调用,所以有一个$this,并且调用实例中静态的方法(您没有声明为静态的)就可以了
      • @elias-van-ootegem 这意味着当我们用 static:: 关键字调用非静态方法时,这相当于用 $this-> 调用?
      • 是的,但:: 是所谓的范围解析运算符,所以self::call() 只是表示在self:: 的范围内调用函数call .总的来说,最好留给静力学使用,以避免混淆。看到self::nonstaticMethod() 有效,我感到相当惊讶。我还以为没有了……
      猜你喜欢
      • 2011-07-27
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      • 2020-05-30
      • 2018-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多