Могу ли я внутри статического метода класса (php) обращаться к свойствам класса через this?

Есть public переменная. И есть статическая функция. Внутри нее не получается обратиться к этой переменной через this. Только если сделать переменную тоже статической и обращаться к ней через self. Это так?
  • Вопрос задан
  • 9283 просмотра
Пригласить эксперта
Ответы на вопрос 6
@Cage
Передайте нужный вам объект в статический метод и получайте от него все что хотите внутри метода.
class MyClass {
    public $b = 1;

    static public function method(MyClass $obj){
        echo $obj->b; // 1
        $obj->b = 2;
    }
}

$obj = new MyClass();
MyClass::method($obj);
echo $obj->b; // 2
Ответ написан
Комментировать
svd71
@svd71
Именно так. Статические элементы могут вызываться из порожденного объкта, но не могут обращаться к элементам объекта: нужна ссылка чтоб знать, какой именно объект.
Ответ написан
Комментировать
$this - это экземпляр объекта изнутри.
то есть
$object = new Class();
тогда $this будет равен $object внутри объекта
Но статическая функция не создает экземпляра объекта, поэтому $this недоступен.
Ответ написан
HaJIuBauKa
@HaJIuBauKa
Вы про позднее статическое связывание?
www.php.net/manual/ru/language.oop5.late-static-bi...
Ответ написан
Комментировать
akubintsev
@akubintsev
Опытный backend разработчик
Да, так. Статические функции работают только со статическими свойствами.
Однако можно сделать инстанцирование объекта внутри статичного метода и работать с его методами или свойствами (но только public разумеется), например
$thisobj = new self();
Естественно, что прежде чем такое делать надо чётко понимать для чего это нужно.
Ответ написан
@MIKEk8
Печаль-беда:
class class_a{
    static function method(){
        if(isset($this)) echo "true"; else echo "false";
    }
}

1) Если вызывать статический метод как обычный $a->method(); то он всё равно вызывается как class_a::method(); т.е. в этом методе НИКОГДА нет переменой $this.
2) PHP не даёт создать одноимённый метод но не статичный. не даёт перехватить магическим методом __call, т.к. метод method существует.
Можно сделать метод method protected , и перехватывать его вызов в __call и __callStatic
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы