在提供的课程中,我需要从静态和对象内部两种方式调用 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__);
}
}
答案 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;
}