Подтвердить что ты не робот

Как установить атрибуты для объекта stdClass при создании объекта времени

Я хочу установить атрибут для объекта stdClass в одном выражении. Я понятия не имею об этом. Я знаю следующие вещи

$obj = new stdClass;
$obj->attr = 'loremipsum';

Требуется два оператора.

$obj = (object) array('attr'=>'loremipsum');

Он принимает одно выражение, но это не прямой метод.

$obj = new stdClass(array('attr'=>'loremipsum'));

Он не работает.

4b9b3361

Ответ 1

$obj = (object) array(
    'attr'=>'loremipsum'
);

Собственно, это так прямо, как это собирается получить. Даже пользовательский конструктор не сможет сделать это в одном выражении.

Листинг (object) может фактически быть простым переводом из массива, поскольку внутренние свойства сохраняются также в хеше.

Вы можете создать базовый класс следующим образом:

abstract class MyObject
{
    public function __construct(array $attributes = array())
    {
        foreach ($attributes as $name => $value) {
            $this->{$name} = $value;
        }
    }
}

class MyWhatever extends MyObject
{
}

$x = new MyWhatever(array(
    'attr' => 'loremipsum',
));

Это приведет к блокировке вашего конструктора, требуя, чтобы каждый класс вызывал свой родительский конструктор при переопределении.

Ответ 2

Хотя Ja͢ck дает хороший ответ, важно подчеркнуть, что сам интерпретатор PHP имеет метод описания как правильно представлять объект или переменную:

php > $someObject = new stdClass();
php > $someObject->name = 'Ethan';
php > var_export($someObject);
stdClass::__set_state(array(
   'name' => 'Ethan',
))

Интересно, что при использовании stdClass::__set_state не удается создать объект stdClass, таким образом отображая его как таковой, скорее всего ошибка в var_export(). Однако он показывает, что нет простого метода создания объекта stdClass с атрибутами, установленными во время создания объекта.

Ответ 3

        foreach ($attributes as $name => $value) {
            if (property_exists(self::class, $name)) {
                $this->{$name} = $value;
            }
        }

является самым чистым, потому что он установит произвольный атрибут, если print_r (get_object_vars ($ obj)) возвращенного объекта, если атрибут не существует.

Ответ 4

$obj = json_decode('{"attr":1,"B":[1,2]}');