Créer un objet par défaut à partir dune valeur vide en PHP?
On décembre 1, 2020 by adminConsidérez le code suivant.
$car = (object)[ "general" => [ "interior" => [ "seats" => "destroyed" ] ] ]; $exteriorProperties = [ "hood" => "shiny", "windows" => "dirty" ]; foreach($exteriorProperties as $key => $prop){ $car->{"other"}->{"exterior"}->{$key} = $prop; }
Ceci est un scénario où je « d comme ajouter des propriétés à un objet, quelques couches de profondeur à la fois, tout en itérant à travers dautres données. Sil nexiste pas, il le créera, sil le fait, il le remplacera. PARFAIT!
Malheureusement, cela lancera lavertissement:
Création dun objet par défaut à partir dune valeur vide
Je pourrais résoudre le problème en vérifiant dabord si la propriété existe comme suit:
foreach($exteriorProperties as $key => $prop){ if(!isset($car->other)) $car->other = (object)[]; if(!isset($car->other->exterior)) $car->other->exterior = (object)[]; $car->other->exterior->{$key} = $prop; }
Ce nest pas mon idéal Solution. Je me demande sil existe une solution plus élégante. Actuellement, jutilise ceci:
@$car->{"other"}->{"exterior"}->{$key} = $prop;
pour supprimer les avertissements mais je minquiète de la compatibilité à lavenir.
quelquun a une solution plus élégante à ce scénario?
Commentaires
- Don ' t utiliser les tableaux comme la réponse ci-dessous suggère dutiliser lobjet correctement. Les tableaux ne sont bons que pour le code local, partagés en dehors dun fichier ou dune classe signifie que vous écrivez des clés manuellement, devez vous en souvenir, en manquer une ou deux, faute de frappe. Un bon IDE avec auto-complétion et des objets avec getter / setter sont un monde de développement heureux.
Réponse
Oui, utilisez des tableaux.
$car = [ "general" => [ "interior" => [ "seats" => "destroyed" ] ] ]; $exteriorProperties = [ "hood" => "shiny", "windows" => "dirty" ]; foreach($exteriorProperties as $key => $prop){ $car["other"]["exterior"][$key] = $prop; } $car = (object) $car;
De toute façon, la conversion dobjet ne convertira que le tableau le plus à lextérieur. Les tableaux imbriqués sont toujours des tableaux.
\is_array($car->general); // true
Pourquoi avez-vous besoin que ce soit des objets sans forme de toute façon? Définir des classes pour ces objets ou les traiter comme des tableaux est la réponse simple.
Btw $car->{"other"}
est une façon vraiment étrange décrire $car->other
…
Commentaires
- Je suppose que vous ' avez raison, je viens de déteste être enfermé dans des tableaux tout le temps. Le
$car->{'other'}
est dû au fait que la plupart de mes clés de propriété proviennent de variables de chaîne. comme$car->{$var1}->{$var2}
Answer
Oui, vous pouvez éviter les opérations conditionnelles itérées en traitant toutes les données sous forme de tableaux.
Code: ( Démo )
$car = json_decode( json_encode( array_replace_recursive( (array)$car, ["other" => ["exterior" => $exteriorProperties]] ) ) );
Lorsque vous ne convertissez que le niveau supérieur de type objet en type tableau, vous pouvez simplement le convertir avec (array)
. Si vous avez besoin de convertir tous les niveaux – json encode lobjet entier, décode cette chaîne en tableau. Lorsque vous avez terminé le traitement, utilisez les fonctions json_
pour rétablir les données en type objet.
Je trouve toujours cela un peu maladroit (peut-être aussi maladroit que votre approche conditionnelle). Lavantage de ce qui précède réside dans la récursivité; si la profondeur de vos données change, vous n’avez pas besoin de modifier le script de traitement. Demandez-vous si vous avez réellement besoin d’utiliser un objet. Si le codage est simplifié avec un type de données différent, peut-être repenser / refactor.
Ps DEFINITEMENT nécrivez pas lopérateur stfu (@
) dans votre code. Dans presque toutes les implémentations, la technique est évitable (cest lun de ces cas) et les projets avec une telle syntaxe sont classés / présumés comme de mauvaise qualité par des développeurs avertis.
Commentaires
- Merci, bonne évaluation. Je nai malheureusement pu choisir que des objets car un ancien programmeur la codé comme tel.
Laisser un commentaire