PHP Deprecated: Нестатический метод не должен вызываться статически

19 нояб. 2017 г., 09:53:19
Просмотры: 30.4K
Голосов: 3

В моем файле debug.log есть следующее сообщение, которое указывает на /wp-includes/shortcodes.php строка 319, что является частью ядра WordPress и, вероятно, не является местом, где находится реальная ошибка в коде.

PHP Deprecated:  Non-static method RSSjbClass::RSSjb_funct() should not be called statically in /.../wp-includes/shortcodes.php on line 319

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

/**
 * Добавление шорткода в wordpress
 */
// add_shortcode('RSSjb', 'RSSjb_funct');
add_shortcode('RSSjb', array('RSSjbClass', 'RSSjb_funct'));
/**
 * Класс и Функция шорткода
 */
class RSSjbClass {
    function RSSjb_funct($atts) {
        extract(shortcode_atts(array(
        // атрибуты для Google News
        "gsearch" => '',
        "topic" => '',
        "location" => '',
        "geo" => '',
        "feed" => '', // обязательно
        "filter" => '',
        "num" => '5',
        "ltime" => '',
        "list" => 'ul',
        "target" => '_blank',
        "pubdate" => 'false',
        "pubtime" => 'false',
        "dformat" => get_option('date_format'),
        "tformat" => get_option('time_format'),
        "pubauthor" => 'true',
        "excerpt" => 'false',
        "charex" => '',
        "chartle" => '',
        "title" => '',
        "link" => 'false',
        "sort" => 'false',
        "cachefeed" => '3600'
    ), $atts));

за которым следует несколько "if" и затем

    // вызов функции для чтения и отображения списка элементов ленты
        return $tle . rssjb_List($feed, $filter, $num, $ltime, $list, $target, $pubdate, $pubtime, $dformat, $tformat, $pubauthor, $excerpt, $charex, $chartle, $sort, $cachefeed);
    } else {
        return '<br>URL RSS или Atom ленты не указан. Этот шорткод требует атрибут feed или location (для Google News).<br /> Пример: <code>[RSSjb feed = "http://ваш-url-rss-или-atom-ленты"]</code>.'; 
    }
    }
}

Как мне изменить это, чтобы соответствовать тому, что находится в /wp-includes/shortcodes.php строка 319, которая:

    $output = $m[1] . call_user_func( $shortcode_tags[ $tag ], $attr, $content, $tag ) . $m[6];

    /**
     * Фильтрует вывод, созданный callback-функцией шорткода.
     *
     * @since 4.7.0
     *
     * @param string       $output Вывод шорткода.
     * @param string       $tag    Имя шорткода.
     * @param array|string $attr   Массив атрибутов шорткода или пустая строка.
     * @param array        $m      Массив совпадений регулярного выражения.
     */
    return apply_filters( 'do_shortcode_tag', $output, $tag, $attr, $m );
}

Я искал в руководстве PHP, но там нет ничего о шорткодах.

0
Все ответы на вопрос 2
2

Шорткоды — это особенность WordPress, поэтому их нет в руководстве по PHP. Вместо этого в руководстве по PHP вам стоит обратить внимание на раздел о колбэках (callback). Функция add_shortcode() принимает имя шорткода и колбэк. В этом разделе руководства PHP вы увидите три основных типа колбэков:

// Тип 1: Простой колбэк
call_user_func('my_callback_function');

// Тип 2: Вызов статического метода класса
call_user_func(array('MyClass', 'myCallbackMethod'));

// Тип 3: Вызов метода объекта
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));

Колбэк-функция для вашего шорткода относится ко второму типу:

add_shortcode('RSSjb', array('RSSjbClass', 'RSSjb_funct'));

Это эквивалентно вызову RSSjbClass::RSSjb_funct, то есть статического метода, но в вашем классе метод RSSjb_funct() не объявлен как статический:

function RSSjb_funct($atts) {

Самое быстрое решение — объявить этот метод как static:

public static function RSSjb_funct($atts) {

Другой вариант — добавить шорткод внутри класса, используя $this, либо создать экземпляр класса и передать его в add_shortcode(), как в третьем типе выше.

19 нояб. 2017 г. 10:36:51
Комментарии

Спасибо за полезное объяснение. Добавление public static сработало. Я бы проголосовал за ваш ответ, но у меня пока недостаточно репутации для этого. Надеюсь, кто-то другой проголосует за него.

Cynthia A Lockley Cynthia A Lockley
19 нояб. 2017 г. 11:01:17

Ах, я только что получил необходимую репутацию и проголосовал за ваш ответ.

Cynthia A Lockley Cynthia A Lockley
19 нояб. 2017 г. 11:03:44
0

Если вы не хотите вызывать метод класса статически, вы можете сделать следующее:

add_shortcode('RSSjb', [new RSSjbClass, 'RSSjb_funct']);
20 окт. 2019 г. 02:16:42