I want to set attribute for a stdClass object in a single statement.
I don't have any idea about it. I know the following things
$obj = new stdClass;
$obj->attr = 'loremipsum';
It takes two statements.
$obj = (object) array('attr'=>'loremipsum');
It takes single statement but it is not direct method.
$obj = new stdClass(array('attr'=>'loremipsum'));
It is not working.
$obj = (object) array(
'attr'=>'loremipsum'
);
Actually, that's as direct as it's going to get. Even a custom constructor won't be able to do this in a single expression.
The (object)
cast might actually be a simple translation from an array, because internally the properties are stored in a hash as well.
You could create a base class like this:
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',
));
Doing so will lock up your constructor though, requiring each class to call its parent constructor when overridden.
Though Ja͢ck gives a good answer, it is important to stress that the PHP interpreter itself has a method for describing how to properly represent an object or variable:
php > $someObject = new stdClass();
php > $someObject->name = 'Ethan';
php > var_export($someObject);
stdClass::__set_state(array(
'name' => 'Ethan',
))
Interestingly, using stdClass::__set_state
fails to create a stdClass object, thus displaying it as such is likely a bug in var_export()
. However, it does illustrate that there is no straightforward method to create the stdClass object with attributes set at the time of object creation.
foreach ($attributes as $name => $value) {
if (property_exists(self::class, $name)) {
$this->{$name} = $value;
}
}
is cleanest because it will set an arbitrary attribute if you print_r(get_object_vars($obj)) of returned object if attribute does not exist.
$obj = json_decode('{"attr":1,"B":[1,2]}');