У меня есть следующая проблема:
Текущий код приложения, над которым я работаю, содержит очень много определений, подобных этому:
$obj = new stdClass();
$obj->a->b = "something";
Это приводит к: PHP Строгие Стандарты: Создание объекта по умолчанию из пустого значения в [где-то].
Правильная форма будет:
$obj = new stdClass();
$obj->a = new stdClass();
$obj->a->b = "something";
Теперь проблема: замена этого во всем коде заняла бы много времени (рассмотрим тысячи случаев, с условиями и т. Д.).
Поэтому я думал о замене stdClass на собственный объект (это будет простая замена в коде), создание для него установщика, который проверяет, является ли свойство переменной объектом, и определяет его как объект, если он задан до установки второго свойства. ,
Итак, мы получаем:
class MockObject() {
public function __set($property, $value) {
// Do stuff here
}
}
$obj = new MockObject();
$object->a->b = "something";
Проблема в том, что при выполнении $ object-> a-> b = «что-то»; setter не вызывается (потому что на самом деле вы устанавливаете не свойство a, а свойство b).
Есть ли способ обойти это? Или возможно другое решение?
Примечание: явный вызов метода __set () не является решением, поскольку он будет таким же, как определение свойств как stdClass ().
Вы знаете о волшебном сеттере.
Используйте также магический добытчик.
Если он хочет получить несуществующую переменную: создайте ее (в массиве или что-то в этом роде), которая является экземпляром этого класса.
Почему бы вам не инициализировать свой b
переменная в конструкторе A class
?
public function __construct()
{
$this->b = new B();
}