88 votes

Accès au tableau retourné par une fonction en php

J'utilise un moteur de modèles qui insère du code dans mon site là où je le souhaite.

J'ai écrit une fonction pour tester quelque chose qui est assez facile :

myfunction() { return '($this->data["a"]["b"] ? true : false)'; }

Le problème est que $this->data est privée, et je ne peux pas y accéder partout, donc je dois utiliser getData() ; ce qui cause mon problème.

$this->getData()['a']['b']

ne fonctionne pas, et assigner la valeur en premier ne fonctionne pas non plus car elle sera utilisée directement dans un bloc if().

Des idées ?

132voto

enyo Points 5083

Depuis PHP 5.4, il est possible de faire exactement cela :

getSomeArray()[2]

Référence : https://secure.php.net/manual/en/language.types.array.php#example-62

Sous PHP 5.3 ou antérieur, vous devrez utiliser une variable temporaire.

16voto

Pascal MARTIN Points 195780

Vous ne pouvez pas utiliser quelque chose comme ça :

$this->getData()['a']['b']

c'est-à-dire que la syntaxe d'accès aux tableaux n'est pas possible directement sur un appel de fonction.

Vous devez utiliser des variable temporaire comme ceci :

$tmp = $this->getData();
$tmp['a']['b']    // use $tmp, now

Dans votre cas, cela signifie probablement utiliser quelque chose comme ceci :

function myfunction() {
  $tmp = $this->getData();
  return ($tmp['a']['b'] ? true : false);
}

Vous devez :

  • d'abord, appelez votre getData() et stocke sa valeur de retour dans une varibale temporaire.
  • puis, utilisez cette variable temporaire pour votre test

Vous n'avez pas beaucoup de choix à ce sujet, en fait...

12voto

enyo Points 5083

Ok... apparemment il n'y a pas vraiment de meilleure solution, donc je vais me répondre avec une solution pas si belle :

J'ai créé la fonction :

arrayGet($array, $index) { return $array[$index]; }

Et je l'ai utilisé comme ça :

myfunction() { return '(arrayGet(arrayGet($this, "a"), "b") ? true : false)' }

Ce n'est pas joli mais ça marche.

1voto

soulmerge Points 37314

$this->data es toujours accessible, si elle est protégée. $object->data n'est pas accessible de partout, donc si vous revenez $this dans votre code, et qu'il est évalué comme tel, il devrait être correct.

Btw, il y a un bug dans votre code : Les guillemets doivent être échappés.

myfunction() { return '($this->data[\'a\'][\'b\'] ? true : false)'; }

1voto

Mészáros Lajos Points 620

C'est possible à partir de la version 5.4 de PHP.

Si vous ne voulez pas d'une variable temporaire pour cela et votre version de PHP est inférieure à 5.4. mais vous pouvez toujours utiliser quelques fonctions intégrées pour obtenir le premier ou le dernier élément :

$x     = 'first?last';
$first = array_shift(explode('?', $x));
$last  = end(explode('?', $x));
$last2 = array_pop(explode('?', $x));

Edita: ! !! Veuillez noter que dans les versions ultérieures (5.4+), PHP émettra un message d'erreur, car end n'attend que des variables comme paramètres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X