在对象'中检查天气;在PHP中是否存在上下文
在提供的类中,我需要从静态和对象内部调用pre函数。但我不能这么做,我的班级代码在对象'中检查天气;在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
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错误。