在PHP中检查对象上下文中的天气与否

时间:2015-05-25 10:50:40

标签: php oop

在提供的课程中,我需要从静态和对象内部两种方式调用 pre 函数。但我不能这样做。我的班级代码

class mc {

   public $trace_back = 1;

    public static function pre() {
        if(isset($this) && isset($this->trace_back)){
            $trace_back = $this->trace_back;
        }
        else{
            $trace_back = 1;
        }
        echo $trace_back; 
    }

}

现在我在静静地打电话

mc::pre(); // echo 1;

它回应 1 ,这正如预期的那样好 但在对象上下文时,如

function mcpre(){
    $mc = new mc();
    $mc->trace_back = 3;
    $mc->pre(); // echo 1
}

当预期3时,它再次回应1。

在更广泛的视野中,我的问题是如何以静态和对象内的方式调用函数。

这也行不通。

class Foo {
  function bar() {
     $static = !(isset($this) && get_class($this) == __CLASS__);
  }
}

2 个答案:

答案 0 :(得分:2)

班级的静态方法无法访问任何非静态成员,包括$this;如果要在任何静态方法中访问$trace_back,则需要将其声明为静态。

<?php
class mc {
    public static $trace_back = 1;
    public static function pre() {
        echo self::$trace_back . "<br />"; 
    }
}

mc::pre(); // echoes 1
mc::$trace_back = 2;
mc::pre(); // echoes 2
?>

您会发现this非常有用。

  

因为静态方法可以在没有对象实例的情况下调用   创建后,伪变量$this在方法中不可用   声明为静态。

     

无法使用对象通过对象访问静态属性   箭头操作符->

     

静态调用非静态方法会生成E_STRICT级别   警告。

答案 1 :(得分:0)

在函数中更改函数以返回值:

public static function pre() {
    if(isset($this) && isset($this->trace_back)){
        $trace_back = $this->trace_back;
    }
    else{
        $trace_back = 1;
    }
    return  $trace_back;
}