Что именно означает $ this в add_action () - PullRequest
0 голосов
/ 09 февраля 2019

Некоторые операторы add_action (), которые я вижу время от времени, снабжены массивом, в котором первый аргумент - это $ this, а второй - функция.

Насколько я знаю, $ это текущий экземпляр в POO, но как насчет этого конкретного случая?Скажем для примера, что у нас есть система рассылки, которая регистрирует ваш адрес электронной почты, за исключением случаев, когда он все еще существует в базе данных.

<?php
public function save_email()
{
    if (isset($_POST['zero_newsletter_email']) && !empty($_POST['zero_newsletter_email'])) {
        global $wpdb;
        $email = $_POST['zero_newsletter_email'];

        $row = $wpdb->get_row("SELECT * FROM {$wpdb->prefix}zero_newsletter_email WHERE email = '$email'");
        if (is_null($row)) {
            $wpdb->insert("{$wpdb->prefix}zero_newsletter_email", array('email' => $email));
        }
    }
} 

Теперь нам нужно объявить его как доступное действие.зачем нам нужен такой массив?

add_action('wp_loaded', array($this, 'save_email'));

И почему мы не можем просто сделать так, как следует?

add_action('wp_loaded','save_email');

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Поскольку save_email является методом класса, и мы добавляем действие из $this экземпляра класса (т. Е. Из класса, владеющего методом).

Массив представляет вызываемый PHP, см. Тип3 в примере: http://php.net/manual/en/language.types.callable.php

0 голосов
/ 09 февраля 2019

Это слишком долго для комментария.

$this - текущий экземпляр текущего класса.Так что это будет случай, вызывающий крюк.Или класс, в который добавляется действие.

add_action('wp_loaded', array($this, 'save_email'));

Итак, это адрес электронной почты для сохранения в текущем классе.

И почему мы не можем просто сделать так, как следует?

add_action('wp_loaded','save_email');

Потому что вы не можете ... Шучу.

это связано с использованием call_user_func_array

http://php.net/manual/en/function.call-user-func-array.php

Что является встроенным способом сделать это.Я уверен, что это также связано с тем, как функции вызываются, потому что без класса было бы неоднозначно, если бы это была функция или метод класса.

В случае, если вы представите, PHP подумает, чтобыла функция.Даже если бы был способ сказать это, это не так, как бы вы сказали, в каком классе находится этот метод. Поэтому проще и безопаснее просто поместить класс в ...

...