Как сделать так, чтобы «я» в родительском классе ссылалось на расширенный класс в PHP? - PullRequest
0 голосов
/ 16 февраля 2020

Я работаю с Wordpress и мне нужно создать новый класс, похожий на этот упрощенный пример (для ловушки add_action(), которая получает некоторые аргументы):

class A {
        public function __construct() {
        }

        public static function init() {
                $instance = new self();
                $instance->doStuff();
        }

        protected function doStuff() {
                echo get_class($this);
        }
}

class B extends A {
}

B::init(); //returns 'A'

Как я могу получить self в init() ссылаться на расширенные классы при вызове из них? Мне известна страница поздних сообщений c о привязках в документах PHP, но я не совсем понимаю, как ее применить в вышеуказанном контексте. Спасибо!

1 Ответ

4 голосов
/ 16 февраля 2020
public static function init() {
    $instance = new static();
    $instance->doStuff();
}

Вы можете видеть, что это работает над 3v4l , который является отличным местом для песочницы PHP.

Почему static? Вы были правы, обращаясь к руководству PHP для поздних привязок stati c , и жаль, что страница явно не упоминает об этом конкретном c использовании ключевого слова stati c ( хотя есть комментарий, который делает).

В контексте поздних привязок stati c, вы можете заменить self на static, и он будет использовать экземпляр класса, тогда как self будет используйте класс, в котором живет код. Например:

<?php
class A {

}

class B extends A {
    public function test() {
        echo parent::class;
        echo self::class;
        echo static::class;
    }
}
class C extends B {

}

$c = new C();
$c->test();

Это работает даже в контексте stati c (к сожалению, ключевое слово stati c используется в двух разных контекстах: stati c звонки, и позднее stati c привязка), как в моем примере выше.

...