How to set attributes for stdClass object at the time object creation

后端 未结 3 869
一个人的身影
一个人的身影 2021-02-03 18:40

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;
$         


        
相关标签:
3条回答
  • 2021-02-03 18:46

    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.

    0 讨论(0)
  • 2021-02-03 18:46
    $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.

    0 讨论(0)
  • 2021-02-03 18:54
            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.

    0 讨论(0)
提交回复
热议问题