9
votes

Tableau PHP avec valeur par défaut pour les indices inexistants

J'aime la mise en œuvre du hasch de Ruby où vous pouvez initialiser l'objet Hash avec une valeur par défaut. Pour le moment, j'ai du mal à mettre en œuvre un objet similaire dans PHP. Ceci est mon premier tir (non fonctionnel) à cela.

$myarr['value']->myVal=5;


2 commentaires

Lors de l'accès à une clé qui n'existe pas, offsetTiet définira cette touche avec la valeur par défaut (voir offsetsett ). Cela signifie la prochaine fois qu'il existera. Si vous ne voulez pas que ce comportement et que vous obtenez toujours la valeur par défaut actuelle pour les touches non existantes, supprimez l'appel offsetsett .


Merci, Gumbo pour la clarification importante, ce comportement m'a déconcerté lors de mon premier test, mais est le comportement prévu. La question des questions répondit maintenant et je laisserai le code de test défectueux tel qu'il est.


4 Réponses :


6
votes
class DefaultArray extends ArrayObject
{
    public function __construct($value = null){
        if(is_null($value))
        {
            $this->value = 'default';
        } else {
            $this->value = $value;
        }
    }
}

2 commentaires

Merci, vous avez repéré mon erreur! C'est $ da-> setingdefault (1) au lieu de $ da-> setingdefault = 1! Oh l'embarcalement! Avec cette modification, mon exemple fonctionne comme prévu. J'ai également pensé à passer la valeur par défaut dans le constructeur, mais je voulais préserver les arguments du constructeur d'origine de ArrayObject.


Vous pouvez utiliser ma bibliothèque minuscule valoresolver pour le rendre plus compact.



-3
votes

Pourquoi donc compliqué? XXX PRE>

MAINTENANT Il vous suffit d'appeler: P>

initVal('bla');
$myarr['bla']->bla = 'bla';


1 commentaires

L'utilisation de la classe ArrayObject conserve toutes les variables et les méthodes de support au même endroit. Lorsque l'utilisation de la fonction global a une probabilité beaucoup plus élevée de conduire à des problèmes de maintenance à l'avenir.



3
votes

Essayez le Méthodes magiques __ Obtenir code> .

$da = new DefaultArray();
assert($da['foo'] == null);
$da->setDefault(1);
assert($da['bar'] == 1);


0 commentaires

0
votes

Vous pouvez utiliser ma bibliothèque minuscule valoresolver dans ce cas, par exemple: xxx

Et n'oubliez pas d'utiliser les espaces de noms Utiliser LAPALABS \ valoresolver \ résolveur \ valoresolver;

Il existe également la possibilité de taper, par exemple si la valeur de votre variable devrait Soyez INTEGER , utilisez-le donc: xxx

cochez le docs pour plus d'exemples


0 commentaires