Получение неожиданных предупреждений в коде настроек темы
Я создал собственный класс для регистрации настроек темы, и он работал нормально, но после внесения некоторых изменений начали появляться предупреждения, и я не могу понять, в чем ошибка.
Я объясню старый и новый код, чтобы помочь вам понять проблему.
Рабочая версия
Следующий конструктор принимает три массива, представляющие элементы меню, настройки (секции/поля) и виджеты.
public function __construct($menu = array(), $sections = array(), $widgets = array())
В конструкторе я устанавливаю свойства и вызываю необходимые хуки для страницы настроек, которые должны регистрировать настройки и поля с помощью соответствующих callback-функций. Каждое поле должно отображаться динамически в соответствии с именем его класса, например $render = new $field_class($field, $value, $this);
(Каждое поле имеет свой собственный класс, который расширяет класс настроек темы. Позже я покажу это).
Метод рендеринга поля
/**
* class section fields callback function
*/
public function field_input($field){
if(isset($field['callback']) && function_exists($field['callback'])){
}
if(isset($field['type'])){
$field_class = 'ANONY_optf__'.ucfirst($field['type']);
if(class_exists($field_class)){
$fieldID = $field['id'];
$fieldDefault = isset($field['default']) ? $field['default'] : '';
$value = (isset($this->options->$fieldID))? $this->options->$fieldID : $fieldDefault;
$render = new $field_class($field, $value, $this);
$render->render();
}
}
}
Каждый класс поля принимает три аргумента: $field
, содержащий данные поля (например, id, label, type), $value
- значение опции, соответствующее id поля, и объект родительского класса $this
.
Затем в классе конкретного поля следующий код. (Проблема в конструкторе, поэтому я привел только его)
class ANONY_optf__Switch extends ANONY__Theme_Settings{
function __construct( $field = array(), $value ='', $parent = NULL ){
if( is_object($parent) ) parent::__construct($parent->sections, $parent->args);
$this->field = $field;
$this->value = $value;
}
}
Как видите, класс поля Switch расширяет класс настроек темы.
Проблемная версия
До этого момента все работало нормально, но как только я начал перемещать некоторые строки из родительского класса (метод рендеринга поля) в конструктор конкретного поля, начали появляться предупреждения.
Теперь функция рендеринга выглядит так:
public function field_input($field){
if(isset($field['callback']) && function_exists($field['callback'])){
}
//Массив полей ввода с одинаковой HTML-разметкой
$mixed_types = ['text','number','email', 'password','url'];
if(isset($field['type'])){
$field_class = 'ANONY_optf__'.ucfirst($field['type']);
//Статическое имя класса для полей с одинаковой HTML-разметкой
if(in_array($field['type'], $mixed_types)) $field_class = 'ANONY_optf__Mixed';
if(class_exists($field_class)){
$field = new $field_class($field, $this);
$field->render();
}
}
}
И конструктор конкретного поля:
function __construct( $field = array(), $parent = NULL ){
if( is_object($parent) ) parent::__construct($parent->sections, $parent->args, $parent->widgets);
$this->field = $field;
$fieldID = $this->field['id'];
$fieldDefault = isset($this->field['default']) ? $this->field['default'] : '';
$this->value = (isset($parent->options->$fieldID))? $parent->options->$fieldID : $fieldDefault;
}
После этих изменений я получаю:
Warning: Illegal string offset 'id'.
Notice: Uninitialized string offset: 0.
Хотя я просто переместил код из родительского класса в дочерний.
Не знаю, смог ли я достаточно понятно объяснить проблему, но надеюсь на вашу помощь. Готов объяснить дополнительно, если нужно. Заранее спасибо.
Примечание
Предупреждения появляются, но при этом все отображается корректно. Это может означать, что что-то вызывается дважды, но в первый раз не может найти значения.
