web-dev-qa-db-fra.com

Comment définir les attributs de l'objet stdClass lors de la création de l'objet temporel

Je veux définir l'attribut d'un objet stdClass dans une seule instruction . Je n'en ai aucune idée. Je sais les choses suivantes

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

Il faut deux déclarations.

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

Cela prend une seule déclaration mais ce n’est pas une méthode directe.

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

Ça ne marche pas.

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

En fait, c'est aussi direct que possible. Même un constructeur personnalisé ne pourra pas le faire dans une seule expression.

Le (object) cast peut être est en réalité une simple traduction d'un tableau, car les propriétés sont également stockées dans un hachage.

Vous pouvez créer une classe de base comme ceci:

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',
));

Cela verrouillera cependant votre constructeur, obligeant chaque classe à appeler son constructeur parent en cas de substitution.

57
Ja͢ck

Bien que Ja͢ck donne une bonne réponse, il est important de souligner que l'interpréteur PHP lui-même dispose d'une méthode pour décrire comment représenter correctement un objet ou une variable :

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

Il est intéressant de noter que l'utilisation de stdClass::__set_state ne permet pas de créer un objet stdClass. Par conséquent, l'afficher comme tel est probablement un bogue dans var_export() . Cependant, cela montre qu'il n'existe pas de méthode simple pour créer l'objet stdClass avec les attributs définis au moment de la création de l'objet.

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

est le plus propre car il va définir un attribut arbitraire si vous print_r (get_object_vars ($ obj)) de l'objet retourné si cet attribut n'existe pas.

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