2010-06-04 3 views
2

Comment puis-je transmettre de manière dynamique des "éléments" à la fonction de classe?Passage de l'objet objet à la classe pas comme une chaîne (comme constante) en php?

Par exemple ici, il est un morceau d'une classe et sa fonction où je déclare un élément d'objet (articles) en $ b:

//.......... 
    public function __add2SomeObj($b) {  

     $namespc = $this -> __someObj(); // __someObj() returns object 
     $namespc -> cats = $b; 

      } 
//................... 

Puis-je passer un autre nom à la place cats dynamiquement il a gagné ne sera pas déclaré comme une chaîne? dire quelque chose comme:

//.......... 
     public function __add2SomeObj($a,$b) { 

      $namespc = $this -> __someObj(); // __someObj() returns object 
      $namespc -> $a = $b; 

       } 
    //................... 
} //end of class started above 

$t=new aboveClass() 
$t->__add2SomeObj("cats", array(1=>"PussyCat",2=>"Scratchy")); 
$t->__add2SomeObj("dogs", array(1=>"Waffy",2=>"Sharik")); // once again but dogs... 

Dois-je définir une constante ou quoi faire ceci ou dois-je déclarer varibale protégé comme objet comme (object) $vaaar? Désolé, je suis un peu infamiliar avec PHP POO ...

Répondre

1

Oui, vous pouvez le faire. Lire à propos de variable variables:

Les propriétés de classe peuvent également être accessibles en utilisant des noms de propriétés variables. Le nom de la propriété variable sera résolu dans la portée à partir de laquelle l'appel est effectué. Par exemple, si vous avez une expression telle que $foo->$bar, la portée locale sera examinée pour $bar et sa valeur sera utilisée comme nom de la propriété de $foo. Ceci est également vrai si $bar est un accès au tableau.


Cependant, vous devez être carful lorsqu'ils traitent avec des tableaux:

$namespc->$a[0] 

obtiendra le premier élément du tableau qui est renvoyée par $namespc->$a.

Alors que

$namespc->{$a[0]} 

va d'abord résoudre $a[0], à savoir obtenir la première valeur du tableau $a, et l'utiliser comme nom de la propriété.

+0

Merci! C'est exactement ce que j'ai cherché et ça a marché! Ah, c'est pourquoi dans certaines requêtes SQL je rencontre ces parenthèses sculptées! – moogeek

+1

@moogeek: Oui, cela s'appelle * syntaxe complexe * et surtout utilisez si vous avez des variables dans les chaînes. Vous pouvez lire à ce sujet ici: http://www.php.net/manual/de/language.types.string.php#language.types.string.parsing –

0

syntaxe est correcte:

$obj->cats = $b; 

et

$a = 'cats'; 
$obj->$a = $b; 

fera la même chose.

Comme pour faire "cats" une constante, c'est à vous de décider. Je suggère de mettre l'erreur de déclaration en place:

error_reporting(E_ALL | E_STRICT); 

De cette façon, si vous avez accidentellement mis dans "cast" et ce n'est pas un membre valide, vous aurez une erreur levée.

Enfin, PHP est un langage dynamique. J'ai l'impression que votre arrière-plan pourrait être avec des langages plus statiques. C'est juste quelque chose que vous devez vous familiariser avec et vous devez trouver un équilibre entre la lisibilité et la verbosité. Mais quoi que vous fassiez, n'essayez pas de recréer des idiomes non-PHP en PHP, ce qui est une erreur courante pour les personnes venant d'une langue à l'autre.

1

Ce que vous demandez est de savoir si vous pouvez décider à l'exécution quelle propriété changer à l'intérieur __add2SomeObj que vous dans la deuxième liste. Vous pouvez, et vous avez fait est correct.

Cependant, les propriétés doivent être des chaînes __add2SomeObj, donc vous devez vous assurer que le paramètre $a est une chaîne (il sera automatiquement converti en une chaîne, mais cela peut donner des résultats inattendus si $a est un objet ou un tableau). Deuxièmement, vous autorisez l'appelant à modifier une propriété arbitraire. Cela peut ou non violer l'encapsulation de votre classe en fonction de la classe __someObj renvoie et sur la classe de __add2SomeObj. Il créera également une propriété dynamique sur l'objet $namespce (c'est-à-dire, une qui n'existe pas dans tous les objets de cette classe), ce que vous ne voulez peut-être pas.

Enfin, et a une conséquence du point précédent, __add2SomeObj peut générer une erreur fatale. Donc, je dirais que vous feriez mieux de valider le paramètre $a par rapport à un ensemble de noms de propriété autorisés.

+0

Merci pour la critique utile! Bien sûr, je compterais pour ces choses dans la production, mais les exemples ci-dessus sont juste l'égratignure pour pointer des intervenants dans l'intrigue de la question! – moogeek

Questions connexes