7
votes

Nom de la propriété de la classe PHP

J'ai une classe appelée contact: xxx pré>

à un moment donné de mon code, je voudrais indiquer une propriété dans cette classe et renvoyer le nom de la propriété. P> XXX PRE>

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


6 commentaires

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


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 () 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 syntaxe.


À un moment donné de mon code, je tiens à pointer vers une propriété dans cette classe 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 ?


@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?


4 Réponses :


0
votes

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"


4 commentaires

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é . 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 $) et il y a votre pointeur. Vous pouvez faire $ objet -> $ clé et simplement utiliser $ clé 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.



2
votes

Vous pouvez utiliser get_Object_vars () comme ceci: xxx

mais avec cela, vous devrez supposer que $ objContact-> nom a une valeur unique sur toutes les propriétés ...


0 commentaires

0
votes

Comme mentionné par Konforce, est-ce que vous recherchez? XXX


2 commentaires

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) Pour vérifier si $ var contient un nom de propriété valide pour le Contacts < / code> classe. Il lancera une exception (capable) si elle ne le fait pas.



7
votes

Alors, vous voulez quand vous tapez $ objContact-> nom pour prendre comme réponse non l'évaluation de cette expression mais ses métadonnées, qui, dans ce cas, est un réflexionproperty Objet.

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.

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 $ objcontact ( réflectionclass ) et itérer sur les propriétés.

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.

EDIT:

Pourtant, il existe un moyen de le simuler! Écrivez une classe comme ceci: xxx

alors vous pourrez maintenant faire ceci: xxx


2 commentaires

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;