Как установить атрибуты для объекта stdClass при создании объекта времени
Я хочу установить атрибут для объекта stdClass в одном выражении.
Я понятия не имею об этом. Я знаю следующие вещи
$obj = new stdClass;
$obj->attr = 'loremipsum';
Требуется два оператора.
$obj = (object) array('attr'=>'loremipsum');
Он принимает одно выражение, но это не прямой метод.
$obj = new stdClass(array('attr'=>'loremipsum'));
Он не работает.
Ответы
Ответ 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]}');