在对象'中检查天气;在PHP中是否存在上下文

在对象'中检查天气;在PHP中是否存在上下文,php,oop,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; } els

在提供的类中,我需要从静态和对象内部调用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
}
它再次呼应1,而预期为3

从更广泛的角度来看,我的问题是我们如何以静态和对象内部两种方式调用函数

这也不起作用

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

将函数更改为从函数中的返回值:

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

类的静态方法不能访问任何非静态成员,包括
$this
;如果要在任何静态方法中访问
$trace\u 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
在方法中不可用 声明为静态的

<?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
?>
无法通过使用的对象访问静态属性 箭头运算符
->

静态调用非静态方法会生成
E\u STRICT
级别 警告


简单回答:你没有。为了你自己的缘故。为什么echo语句在函数之外它总是打印1oh,那只是输入错误,我编辑了这个问题。@Alfwed你能更清楚地说明为什么我不应该使用它吗。一个简单的链接就足够了。它肯定会在对象上下文中抛出$this错误。