Динамически создавать свойства объекта, получил: «Строгие стандарты: Создание объекта по умолчанию из пустого значения» - PullRequest
1 голос
/ 21 декабря 2011

Я пытаюсь динамически создавать свойства объекта для JSON-представления объекта.Класс User будет иметь некоторые свойства по умолчанию (установлено в __construct).Я использую пользовательский объект вместо массивов, потому что я предпочитаю объектно-ориентированный стиль (и мне нужны также пользовательские методы установки / получения).

Однако первая попытка дает мне:

СтрогийСтандарты: Создание объекта по умолчанию из пустого значения.

, даже если код действительно работает (и json_encode показывает правильный вывод):

<?php

class User
{
    protected $data = array();

    public function __set($property, $value)
    {
        $this->data[$property] = $value;
    }

}

$u = new User();
$u->name = "James Smith"; // Works
$u->status->active   = false; // Fail
$u->status->modified = time();

var_dump(json_encode($u));

?>

Я думаю, что это потому, что вызов$u->status->active, когда свойство $u->status еще не существует. Вы знаете, как это исправить?

1 Ответ

1 голос
/ 21 декабря 2011

ОК, я разобрался с вами :) Это было интересно.

Во-первых, вы не инициализировали свойство status. Так что в теории этого должно было быть достаточно:

$u->status = new StdClass;

Однако это сложнее, чем это. Даже если вы это сделаете, это не сработает. Это потому, что вы устанавливаете свои поля в массиве данных, но оттуда вы никогда не ПОЛУЧИТЕ ИХ!

Таким образом, когда вы получаете доступ к полю ($ u-> status), вы НЕ берете поле, которое вы только что установили: вы получаете доступ к незаданному свойству объекта. Если вы попытаетесь напечатать $ u-> name после установки, вы ничего не получите, потому что вы не создали функцию получения, которая считывала бы ваш массив данных.

Вам следует либо создать метод получения, либо удалить его (он все равно будет работать, но может оказаться не тем, что вам нужно).

Если вы закомментируете сеттер, все работает без предупреждений. Смотрите эту упрощенную версию:

<?php

error_reporting(E_STRICT);

class User
{

}

$u = new User();
$u->name = "James Smith";
$u->status = new StdClass;    // Comment this line and you will get the strict warning
$u->status->active   = false;

var_dump($u);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...