Проверьте погоду в контексте объекта или нет в PHP

1

В предоставленном классе мне нужно вызвать предварительную функцию как статически, так и внутри объекта. Но я не мог этого сделать. Мой классный код

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__);
  }
}
  • 0
    Краткий ответ: нет. Для вашего же блага.
  • 0
    почему оператор echo находится вне функции, он всегда печатает 1
Показать ещё 2 комментария
Теги:
oop

2 ответа

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 недоступна внутри метода, объявленного как статический.

Статические свойства не могут быть доступны через объект с помощью оператора стрелки ->.

Вызов нестатических методов статически генерирует предупреждение уровня E_STRICT.

  • 0
    Вы! знаю, что это не должно быть так просто. Спасибо чувак!
0

Измените свою функцию, чтобы вернуть значение из с в функции:

public static function pre() {
    if(isset($this) && isset($this->trace_back)){
        $trace_back = $this->trace_back;
    }
    else{
        $trace_back = 1;
    }
    return  $trace_back;
}
  • 2
    Это определенно выдаст ошибку $ this не в контексте объекта.
  • 0
    Опечатка ... Спасибо за исправление :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню