Я хочу установить атрибут для объекта stdClass в одном выражении. Я понятия не имею об этом. Я знаю следующие вещи
$obj = new stdClass; $obj->attr = 'loremipsum';
Он принимает два утверждения.
$obj = (object) array('attr'=>'loremipsum');
Он принимает одно утверждение, но это не прямой метод.
$obj = new stdClass(array('attr'=>'loremipsum'));
Это не работает.
$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', ));
Это приведет к блокировке вашего конструктора, требуя, чтобы каждый класс вызывал свой родительский конструктор при переопределении.
Хотя 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 с атрибутами, установленными во время создания объекта.
foreach ($attributes as $name => $value) { if (property_exists(self::class, $name)) { $this->{$name} = $value; } }
является самым чистым, потому что он установит произвольный атрибут, если print_r (get_object_vars ($ obj)) возвращенного объекта, если атрибут не существует.
$obj = json_decode('{"attr":1,"B":[1,2]}');