В предоставленном классе мне нужно вызвать предварительную функцию как статически, так и внутри объекта. Но я не мог этого сделать. Мой классный код
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__);
}
}
Статические методы класса не имеют доступа к любым нестатическим членам, включая $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
недоступна внутри метода, объявленного как статический.Статические свойства не могут быть доступны через объект с помощью оператора стрелки
->
.Вызов нестатических методов статически генерирует предупреждение уровня
E_STRICT
.
Измените свою функцию, чтобы вернуть значение из с в функции:
public static function pre() {
if(isset($this) && isset($this->trace_back)){
$trace_back = $this->trace_back;
}
else{
$trace_back = 1;
}
return $trace_back;
}