2010-11-22 18 views
1

Comme l'indique la description, j'ai une fonction qui prend en argument un tableau et un objet et assigne tous les champs d'objets à leurs valeurs respectives dans le tableau en fonction du type de l'objet. Les objets ont tous des champs différents, mais ils ont tous un attribut type que la fonction utilise pour déterminer les champs à affecter.Affecter des champs de classe PHP à des valeurs de tableau lors du passage des deux dans une fonction ne définit pas les champs, pourquoi?

Il fonctionne comme ceci:

function unload($arr,&$obj){ <-- //&$obj not $obj 
    if($obj->type == 'A'){ 
    echo 'Setting field for A'; 
    $obj->a = $arr['a_value']; 
    //some more assignments.. 
    } 
    elseif($obj->type == 'B'){ 
    $obj->b = $arr['b_value']; 
    echo 'Setting field for B'; 
    //some more assignments... 
    } 
    //some more elseifs 
    //return an error if 
    //object's type doesn't 
    //match 
    else{ 
    echo 'Error: Object type '.$obj->type.' not recognized.'; 
    } 

} 

$arr['a_value'] = 'SomeValue'; 
$arr['b_value'] = 'SomeOtherValue'; 
$obj = new A(); //A's type set to 'A' upon initialization 
unload($arr,$obj); 
echo 'A->a set to: '.$obj->a; 

Sortie: A> un ensemble à:

Le code entre la branche correcte pour l'objet qui est passé dans, mais aucun des champs de l'objet être affecté. Qu'est-ce que je fais mal?

Le serveur fonctionne sous PHP 4.4.7, je n'ai toujours aucune idée de ce qui cause cela.

Edit: Je ENFIN tout compris, il était une combinaison de 2 choses:

Je ne réalisais pas les noms des champs de classe lorsque le référencement était nécessaire mot-clé $this à partir de la classe. J'ai supposé que les variables avaient une portée globale donc $this était optionnel comme c'est le cas en Java. C'est pourquoi le simple fait de changer la déclaration de la fonction n'a pas résolu le problème. Maintenant tout fonctionne bien!

+0

Sont-ils 'private' dans l'objet? – alex

+0

ne peut pas voir d'erreurs évidentes .. pourriez-vous créer un cas de test simple et l'inclure dans votre question? Notez que plutôt que d'avoir une fonction -> type, vous pouvez utiliser 'instanceof '(par exemple' if ($ obj instanceof SomeClass) {... ' – Hamish

+0

@Hamish Ouais cela fonctionnerait, mais la propriété' type' * peut être quelque chose peu importe de quelle classe c'est – alex

Répondre

2

Quelle version de PHP êtes-vous?

Parce que dans PHP4 vous devez passer explicitement l'objet par référence:

function unload($arr,&$obj){ 

Si sinon vous êtes sur PHP5, vérifiez votre $arr contenu. Et faire un peu print_r à l'intérieur et à l'extérieur de la fonction ...

+0

Ne fonctionne pas. Je fais écho sur le tableau pour m'assurer que les valeurs sont stockées et qu'elles le sont (c'est juste une page de test donc je règle tout manuellement). – primehunter326

+0

J'ai essayé d'imprimer le tableau avec print_r depuis la fonction, tout est passé correctement. Pour tout ce que rien ne sera assigné correctement. – primehunter326

0
  • Si vous souhaitez obtenir le nom de la classe que je vous suggère d'utiliser get_class() qui retourne le nom de la classe. De toute façon pourquoi utilisez-vous A->a au lieu de $obj->a? Cela semble être faux.
  • Et notez que switch pourrait le mieux répondre à vos besoins dans ce cas.

EDIT finalement obtenu: vous devez remplacer

$arr['a'] = 'SomeValue'; 
$arr['b'] = 'SomeOtherValue'; 

avec

$arr['a_value'] = 'SomeValue'; 
$arr['b_value'] = 'SomeOtherValue'; 

ou autrement mis $obj->b = $arr['a_value'];-$obj->b = $arr['a']; et faire la même chose avec la valeur b. La signification de ceci est que les clés de tableau doivent être identiques.

+0

J'ai corrigé la faute de frappe et ajouté dans les instructions d'impression ci-dessus (déjà eu dans mon code). La définition de error_reporting ne change rien. Je sais que j'aurais pu faire cela comme un commutateur, je suis juste habitué à C/Java où vous ne pouvez faire que des primitives de commutation de cas – primehunter326

+0

La définition des rapports d'erreurs va changer! Il imprime une erreur Notice dans le cas où la variable $ obj-> a n'est pas correctement définie. Quelle est la sortie maintenant? – Shoe

+0

Édité et testé, cela fonctionne. – Shoe