J'ai une classe appelée contact: à un moment donné de mon code, je voudrais indiquer une propriété dans cette classe et renvoyer le nom de la propriété. P> Mon problème étant que la fonction clé () ne concerne que des tableaux ou des objets. $ objContact-> Le nom lui-même ne répond pas à ces exigences. Je sais que ce serait aussi simple de taper le nom lui-même dans les champs ID et Nom, mais il s'agit pour les autres utilisations de vérification du code. Imaginez la page du processeur: P> $objContact = new contacts();
echo($objContact->meta->Email);
4 Réponses :
La touche () code> fonction fonctionne très bien avec des objets. Cela n'accomplit tout simplement pas ce que vous essayez d'essayer de faire. $c = new contacts;
end($c);
print key($c); // "DealerID"
C'est vraiment proche - sauf lorsque vous écrivez la valeur de la clé du champ de saisie, je n'aurai pas nécessairement accès au champ avant, cela ne fonctionnera donc pas.
@Jeff: Je l'ai relis. Le creux de votre question est je voudrais pointer vers une propriété code>. Je suppose que vous voulez simplement émis une liste d'attributs sous forme de formulaire. Si oui, vous devrez faire une itération sur les attributs de toute façon foreach ($ contact as $ clé => Valeur $) code> et il y a votre pointeur. Vous pouvez faire $ objet -> $ clé code> et simplement utiliser $ clé code> pour sortir les champs
Sommes-vous alors suggérant de construire les champs de saisie dans la déclaration de Foreach? Ou est une suggestion de construire un tableau de clés $ qui peut être référencée plus tard?
@Jeff. Oui, je pense que la recherche de la force est une bonne façon de le faire - si les attributs sont dans le bon ordre et que vous souhaitez réellement un champ de saisie pour chacun d'eux.
Vous pouvez utiliser get_Object_vars () comme ceci: mais avec cela, vous devrez supposer que $ objContact-> nom a une valeur unique sur toutes les propriétés ... P> p>
Comme mentionné par Konforce, est-ce que vous recherchez?
Ouais - pas exactement. L'utilisation de variables variables laisse toujours la possibilité de référencer un élément de la classe qui n'existe pas vraiment. Je pourrais faire $ var = 'SilyTalk'; $ obj -> $ var et la valeur est NULL lorsqu'il est utilisé ailleurs, car la propriété de 'SilyTalk' n'existe pas.
@Jeff, vous pouvez utiliser $ foo = nouvelle réflectionProperty ('Contacts', $ var) code> Pour vérifier si $ var code> contient un nom de propriété valide pour le Contacts < / code> classe. Il lancera une exception (capable) si elle ne le fait pas.
Alors, vous voulez quand vous tapez Ce que vous voulez est une fonctionnalité appelée métaprogramming ( http: //fr.wikipedia .org / wiki / métaprogramming ). Bien sûr, PHP ne supporte pas cela, mais il existe d'autres langues qui font, telles que LISP, etc. Les rumeurs disent que c # 5.0 introduira de telles fonctionnalités. P> Vous pouvez obtenir un effet similaire en utilisant la réflexion ( http://php.net/manual/fr/book.reflection.php ). Vous pouvez obtenir le méta-objet de Donc, il n'ya aucun moyen d'identifier une propriété spécifique avec un identifiant. La seule façon de faire est avec une chaîne de son nom. P> EDIT: P> Pourtant, il existe un moyen de le simuler! Écrivez une classe comme ceci: p> alors vous pourrez maintenant faire ceci: p> $ objContact-> nom code> pour prendre comme réponse non l'évaluation de cette expression mais ses métadonnées, qui, dans ce cas, est un réflexionproperty Code> Objet. $ objcontact code> ( réflectionclass code>) et itérer sur les propriétés. P>
Pas la réponse que je voulais mais semblant de manière plausible. J'ai regardé dans le reflexobject de PHP et je n'ai donc pas trouvé exactement comment il pourrait être utilisé avec succès. Cela n'aide pas que les fonctions que je voudrais enquêter ne sont pas documentées sur php.net.
Ma seule raison pour être contrarié est que je ne peux pas voter plus d'une fois pour une telle réponse. GÉNIE! J'ai commencé à essayer de trouver une idée similaire au sein de la classe mais j'ai échoué. Cela fonctionnera magnifiquement et peut être fait pour s'intégrer bien comme une classe de base à hériter de sorte que je puisse faire quelque chose de plus dans les lignes de $ ObjContact-> Meta-> nom;
J'ai du mal à comprendre ce que vous voulez accomplir. Comme un seul objet est juste que: un seul objet, comment la clé du pointeur actuel aurait-elle une signification? Que voulez-vous faire avec la clé, pourquoi et comment cela devrait-il avoir une signification pour votre objet?
Vous ne pouvez pas obtenir le «nom» d'une variable, d'une variable. Cependant, vous pouvez obtenir tout un nom de propriétés d'objets à l'aide de
get_Object_vars code>Peut-être que faire une forise sur votre objet vous aiderait, pas parfait mais bon pour un début
Si vous connaissez le nom à une touche
() code> comme fonction similaire, vous avez déjà le nom ... (rappelez-vous que tout élément de données pourrait avoir plusieurs variables nommées différemment à celle-ci.) Peut-être que vous avez vraiment besoin du$ objcontact -> $ dynamic_property code> syntaxe.À un moment donné de mon code, je tiens à pointer vers une propriété dans cette classe Code> Arrêtez-vous là =) Comment avez-vous l'intention de le pointer? Si c'est en tapant le nom, alors pourquoi ne pas saisir à nouveau le nom comme indice de$ _ POST code>?@Shad - car vous utilisez des chaînes comme des pointeurs sur des valeurs dans un objet qui vous engagera de telles données sensibles n'est pas une bonne méthode suffisante pour moi. L'utilisation d'une approche d'oop plus est ce que j'aimerais utiliser. Et comme il est faisable et plus lisible, cela a du sens tout le chemin. Je pense que la question ici serait pourquoi pas?