Вопрос или проблема
Я пытаюсь вызвать метод в виджете функции. $this
виджета передается в этот метод, но я получаю следующую ошибку:
Strict Standards: Non-static method class_name::method_name() should not be called statically, assuming $this from incompatible context in C:\xampp\htdocs\wp\wp-content\themes\...... on line 446
Вот что я пытаюсь сделать точно.
Функция формы виджета:
class new_widget extends WP_Widget {
function form($instance) {
<?php widget_fields::input($instance, 'title'); ?>
}
}
И класс, который я использую вне класса виджета:
class widget_fields {
function input($t, $slug) {
?>
<p>
<input type="text" name="<?php echo $this->get_field_name($slug); ?>" value="<?php echo $t[$slug]; ?>" />
</p>
<?php
}
}
Как говорит ошибка, вы вызываете функцию статически. Если вы хотите использовать её таким образом, вам нужно изменить
function input
на:
static function input
Ответ или решение
Ваша проблема связана с попыткой вызвать нестатический метод статически, что приводит к ошибке стандартов порядка вызова методов PHP. Ошибка, появляющаяся в вашем случае, указывает, что метод widget_fields::input()
вызван без создания экземпляра класса widget_fields
. В результате PHP "предполагает" $this
из несовместимого контекста, что приводит к проблемам.
Как исправить ошибку
Чтобы исправить эту ошибку, у вас есть два варианта:
-
Сделать метод статическим:
Если метод
input()
не использует внутри себя переменные экземпляра$this
, вы можете сделать его статическим. Это заключается в добавлении ключевого словаstatic
перед описанием метода:class widget_fields { static function input($t, $slug) { ?> <p> <input type="text" name="<?php echo self::get_field_name($slug); ?>" value="<?php echo $t[$slug]; ?>" /> </p> <?php } }
В этом случае также необходимо заменить
$this->get_field_name($slug)
наself::get_field_name($slug)
или переместить методget_field_name
внутрь классаwidget_fields
как статический метод (если он всегда используется как статический). -
Создать экземпляр класса:
Если метод
input()
должен использоваться нестатически, необходимо создать объект классаwidget_fields
перед его вызовом:class new_widget extends WP_Widget { function form($instance) { $widgetFields = new widget_fields(); $widgetFields->input($instance, 'title'); } }
Дополнительные рекомендации
-
Профессионализм кода: Убедитесь, что ваш код следует соглашениям о стиле кодирования, принятым в вашей команде или проекте. Это улучшает читабельность и поддержку кода.
-
Производительность: Если возможно, минимизируйте создание экземпляров классов и используйте статические методы, где это применимо, для повышения производительности.
-
Соблюдение стандартов: Проверяйте код на предмет соответствия стандартам PHP. Включение всех предупреждений и ошибок в процессе разработки поможет избежать подобных проблем на ранних стадиях.
Заключение
Ваша задача заключается в выборе наиболее подходящего решения, которое не только устраняет текущую ошибку, но и соответствует архитектурным требованиям вашего проекта. Эффективное решение сможет улучшить стабильность и производительность вашего кода в будущем.