Почему действия с классом и общедоступным методом не запускают __construct ()

Я пытаюсь понять, как WordPress работает с действиями, классами и методами.

Если есть класс TestClass и у него есть общедоступный метод method1

Метод может быть привязан к любому действию как add_action ('theHook', ['TestClass', 'method1']);

Насколько я понимаю. Если вы не инициализируете класс, вы не сможете получить доступ к его общедоступным методам и объектам. Теперь я предполагаю, что WordPress должен следовать этому, и он должен инициализировать мой TestClass, что приведет к срабатыванию public __construct ().

Однако после тестирования он не запускает __construct ().

Почему это?. Я знаю, что исправлением будет самоинициализация внутри «method1», но я пытаюсь понять, почему WordPress так себя ведет.


person Jpv    schedule 27.10.2020    source источник


Ответы (1)


Поскольку WordPress вызывает ваш метод как статическую функцию: TestClass::method()

Есть разные решения:

1. Инициируйте класс перед добавлением действия.

Инициализируйте свой класс перед добавлением действия, например:

$test = new TestClass();
add_action('hook', [$test, 'method']);

2. Перехватчик вызова внутри вашего класса:

class TestClass {
    public function __construct() {
        // Your construct
    }
    public function method() {
        // Your Method
    }

    public function call_hook() {
        add_action('hook', [$this, 'method']);
    }
}

$test = new TestClass();
$test->call_hook();

3. Используйте синглтон

И если вам нужно иметь только один экземпляр вашего класса и вызывать его в другом месте, вам нужно взглянуть на Шаблон проектирования Singleton.

Демонстрация:

class MySingletonClass {

    private static $__instance = null;
    private $count = 0;
    private function __construct() {
        // construct
    }

    public static function getInstance() {
        if (is_null(self::$__instance)) {
            self::$__instance = new MySingletonClass();
        }
        return self::$__instance;
    }

    public function method() {
        $this->count += 1;
        error_log("count:".$this->count);
    }
}

$singleton = MySingletonClass::getInstance();
add_action('wp_head', [$singleton, 'method']);


$singleton2 = MySingletonClass::getInstance();
add_action('wp_footer', [$singleton2, 'method']);
person ZecKa    schedule 27.10.2020