Résoudre l'erreur Illegal Offset Type ?

Mammouth du PHP | 1511 Messages

04 janv. 2007, 12:24

Bonjour,
il arrive que des fois, plongés dans la POO, vous affectiez a un nom de clé dans un tableau un objet...
Malheureusement, votre print_r à beau vous dire que ca contient quelque chose, ca ne marchera pas du tout...
Et pour causer, dixit le site de nexen:
Il n'est pas possible d'utiliser des tableaux ou des objets comme clés. Ce faisant, vous généreriez une alerte : Illegal offset type .
Donc j'ai trouvé cette petite astuce qui vous évitera bien des désagréments :
$array[(string) $objet->var] = $objet->var2;
Et la, fini le Illegal Offset Type ;)
Modifié en dernier par momox le 31 janv. 2008, 22:29, modifié 1 fois.

Petit nouveau ! | 2 Messages

31 janv. 2008, 22:04

ca c'est deja mieux.

Pas besoin d'ecrire du code mort :shock: ! ca vous apprendra a ne pas avoir codé en C++ ou en JAVA avant 8-) qui vous apprend ce qu'est le CAST.

Code : Tout sélectionner

array[(string) $objet->var] = $objet->var2;

Mammouth du PHP | 1511 Messages

31 janv. 2008, 22:28

Je ne connaissais pas le transtypage a l'époque, et puis le premier langage que j'ai utilisé a été le php ;)
Maintenant c'est vrai que j'utilise cette méthode :P, je vais donc mettre à jour l'astuce.
Merci d'avoir fait remonter la chose petros ;)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

31 janv. 2008, 22:44

Il est vrai que le faible typage (qui a dit aucun typage ? 8-) ) de PHP n'est pas toujours un avantage :?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

31 janv. 2008, 23:30

Je crois que l'appelation politiquement correcte est "typage dynamique", et dans le cas présent je ne vois pas ça comme un défaut ou une limitation propre à PHP. Le manuel nous dit que les clés d'un tableau peuvent être des nombres ou des chaînes, on ne nous a pas promis la possibilité d'utiliser des objets, des booléens, voire... des ressources ?

Enfin, quitte à déterrer un sujet, j'aimerais ajouter que caster un objet en chaîne ne donnera pas toujours le résultat escompté, si vous voulez utiliser un identifiant unique pour un objet, regardez du côté de spl_object_hash() (PHP 5.2+)

Eléphant du PHP | 121 Messages

18 févr. 2008, 15:37

Je suis pas très convaincu... puisque les tableaux associatifs seront transtypés en "Array", la seule chose que tu vas obtenir avec ta "solution" c'est une perte de données. S'il est impossible d'utiliser les tableaux en tant que clé, c'est qu'il y a une bonne raison... À moins que ces tableaux soient en fait des objets pour lesquels tu as implémenté la fonction magique "__toString()"...

Eléphant du PHP | 99 Messages

18 févr. 2008, 21:03

Je dit peut-être un truc con mais...pourquoi ne pas utiliser un simple var_export() avec le paramètre de retour pour tranformer objets/tableaux en chaines? Ca serait peut-être plus lent (clefs longues), mais plus sûr, comme le dit gofromiel (théoriquement, le contenu des objets/tableaux devrait être unique).

(Et personnellement, je ne voit pas dans quel cas on peut essayer de mettre un objet en clée de tableau...les clefs sont des identifiants, et les objets/tableaux de conteneurs de valeurs. Autant utiliser les clefs avec leur fonction première...)

Mammouth du PHP | 1511 Messages

18 févr. 2008, 23:01

J'avais rencontré ce problème lors de l'utilisation de la classe simpleXml, j'ai voulu créer un tableau avec comme clé d'index une valeur, hors, $simplexml->monchamp retourne une classe de type simple_xml_element, ce qui m'a posé un problème, j'avais résolu le problème de la sorte ;)

Eléphant du PHP | 121 Messages

19 févr. 2008, 19:18

Le mieux serait d'utiliser serialize() pour transformer tableaux et objets en chaines, mais toute cette idée d'utiliser des tableaux associatif en tant que clé me semble très mauvaise...

Mammouth du PHP | 1511 Messages

19 févr. 2008, 19:32

Le mieux serait d'utiliser serialize() pour transformer tableaux et objets en chaines, mais toute cette idée d'utiliser des tableaux associatif en tant que clé me semble très mauvaise...
En fait, je voulais juste faire $array[$simple_xml_instance->var] = 'value'; et c'est là que ca bloquait et que j'ai du bidouiller ;)
@+