L'extension de ArrayObject en PHP correctement?
Problème: je suis en train d'étendre PHP ArrayObject
comme indiqué ci-dessous. Malheureusement, je ne peux pas le faire fonctionner correctement lors de la configuration multi-objets tridimensionnels et au lieu d'une erreur jeté comme j'ai le strict paramètres activé dans PHP. (Error: Strict standards: Creating default object from empty value
)
Question: Comment puis-je modifier ma classe pour créer automatiquement des non-existant niveaux pour moi?
Le code:
$config = new Config;
$config->lvl1_0 = true; //Works
$config->lvl1_1->lvl2 = true; //Throws error as "lvl1" isn't set already
class Config extends ArrayObject
{
function __construct() {
parent::__construct(array(), self::ARRAY_AS_PROPS);
}
public function offsetSet($k, $v) {
$v = is_array($v) ? new self($v) : $v;
return parent::offsetSet($k, $v);
}
}
Quelle est la version de PHP que vous utilisez?
Salut Industrielle! Avez-vous vraiment besoin de votre
Salut Nick! Non, je l'ai réglé pour une
5.3.5
Je pense que c'est!Salut Industrielle! Avez-vous vraiment besoin de votre
Config
classe à une spécialisation de ArrayObject
, ou vous avez besoin tout simplement parce que les informations de stockage des facilités qu'elle offre?Salut Nick! Non, je l'ai réglé pour une
ArrayObject
mise en œuvre après cette question: stackoverflow.com/questions/7202784/...OriginalL'auteur Industrial | 2011-08-31
Vous devez vous connecter pour publier un commentaire.
Plus oop vue de votre problème, vous pouvez créer une classe qui modélise le concept d'un objet multidimensionnel.
La solution im affichage ne s'étend à partir de
ArrayObject
à obtenir les objectifs que vous mentionnez. Comme vous étiquetés à votre question dans la programmation orientée objet, je pense qu'il est important de renforcer la séparation de la façon dont vous stockez l'état d'un objet à partir de comment faire pour y avoir accès.Espère que ce sera vous aider à obtenir ce dont vous avez besoin!
De ce que vous avez dit, un multi-dimensionnelle de l'objet est celle qui:
$config->database->host = 'localhost'
ladatabase
ethost
niveaux sont initialisés automatiquement, ethost
sera de retour'localhost'
lorsqu'il est interrogé.Solution Proposée
Alors, comment pouvez-ces fonctionnalités de mise en œuvre?
La deuxième question est simple: à l'aide de PHP
__get
et__set
méthodes. Ceux qui sera appelée à chaque fois qu'une lecture/écriture est beign fait sur un inaccesible propriété (qui n'est pas défini dans un objet).L'astuce sera alors de ne pas déclarer tous les biens et gérer les propriétés des opérations par le biais de ces méthodes et de la carte le nom de la propriété beign accessible comme une clé pour un assosiative tableau utilisé comme espace de stockage. Ils offrent essentiellement une interface d'accès aux informations enregistrées dans la mémoire interne.
Pour la troisième, nous avons besoin d'un moyen de créer un nouveau niveau d'imbrication lorsqu'un non déclarées propriété est lue.
Le point clé ici est de réaliser que la valeur retournée par la propriété doit être un multi-dimensionnelle de l'objet pour d'autres niveaux d'imbrication peut être créé à partir d'elle aussi: à chaque fois qu'on a demandé pour une propriété dont le nom n'est pas présent dans le tableau interne, bien associer ce nom avec une nouvelle instance de
MultiDimensionalObject
et de le retourner. L'objet retourné sera capable de gérer défini ou indéfini propriétés de trop.Lorsqu'un non déclarées propriété est écrit, tout ce que nous avons à faire est d'attribuer son nom à la valeur indiquée dans le tableau interne.
Le quatrième est facile (voir sur
__construct
mise en œuvre). Nous avons juste à faire en sorte que nous créons unMultiDimensionalObject
lorsqu'une valeur de la propriété est un tableau.Enfin, le poing: la façon dont nous traitons les deuxième et troisième caractéristiques nous permet de lire et d'écrire des propriétés (déclarés et non déclarés) dans n'importe quel niveau d'imbrication.
Vous pouvez faire des choses comme
$config->foo->bar->baz = 'hello'
sur un vide instance et requête pour$config->foo->bar->baz
avec succès.Important
Notez que
MultiDimensionalObject
au lieu de beign lui-même un tableau est-il composé avec un tableau, vous permettant de changer la façon dont vous stockez l'état de l'objet en tant que de besoin.Mise en œuvre
Démo
Code:
var_dump(nouveau MultiDimensionalObject());
Résultat:
Code:
Résultat:
Code:
Résultat:
Code:
Résultat:
OriginalL'auteur nick2083
Mettre en œuvre les
offsetGet
méthode. Si vous accédez à un non existe pas de propriété, vous pouvez en créer un que vous aimez.Que vous êtes étendre ArrayObject, vous devez utiliser la matrice de façon [] à fixer ou à obtenir.
OriginalL'auteur xdazz
Copié collé ton code et il fonctionne très bien sur mon test PHP boîte (l'exécution de PHP 5.3.6). Il ne mentionne les Normes Strictes d'avertissement, mais il fonctionne toujours comme prévu. Voici la sortie de print_r:
Il est intéressant de noter que sur le PHP docs il y a un commentaire avec des conseils liées à ce que vous essayez de faire:
Explication détaillée est lié ci-dessus, mais en plus de
offsetSet
que vous pouvez avoir etoffsetGet
qui xdazz mentionne, vous devez également mettre en œuvreoffsetExists
etoffsetUnset
. Cela ne devrait pas avoir quelque chose à faire avec votre erreur, mais c'est quelque chose que vous devriez être conscient de.Mise à jour: xdazz de la seconde moitié a la réponse à votre problème. Si vous accédez à votre Config objet comme un tableau, il fonctionne sans erreur:
Pouvez-vous le faire ou êtes-vous limité à l'Objet de la syntaxe pour une raison quelconque?
Malheureusement (pour ton cas), il fonctionne comme prévu. Vous êtes à la création d'un objet à partir d'une valeur vide de sorte qu'il vous dise de le faire. Vous pouvez le masquer en utilisant
ini_set('display_errors', 0);
ou d'éteindre le Strict rapport d'erreurerror_reporting(E_ALL);
l'un de ces une option?OriginalL'auteur Farray