Tableau d'accès retourné par une fonction en php

88

J'utilise un moteur de modèle 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 simple:

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

Le problème est que $ this-> data est privé, 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 l'affectation de la valeur en premier ne le fait pas non plus car elle sera utilisée directement dans un bloc if ().

Des idées?

enyo
la source
L'attribution de la valeur de retour fonctionne certainement et est le seul moyen. Pouvez-vous nous montrer votre code non fonctionnel?
Anti Veeranna
Eh bien cela ne fonctionne pas car le code sera inséré dans un if (/ * code ici * /). Je ne peux donc pas simplement attribuer les données avant.
enyo du
1
Que diable construisez-vous de toute façon? :) quelque chose avec eval?
Anti Veeranna
Qu'essayez-vous de vérifier? Essayez-vous de voir si l'élément de tableau existe et a une valeur non vide? Vous pouvez utiliser la fonction «vide» pour cela. Cette question a besoin de plus de clarté!
txwikinger le
Comment cette valeur de chaîne que vous retournez est-elle myfunction()traitée ultérieurement? Cette partie manque à votre question.
hakre

Réponses:

134

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

Sur PHP 5.3 ou version antérieure, vous devrez utiliser une variable temporaire.

enyo
la source
4
J'ai PHP 5.4.11-1~precise+1et cette fonctionnalité ne fonctionne pas! Vous avez un message en réponseParse error: syntax error, unexpected '['
Eugene
1
+ Eugene l'avez-vous fait fonctionner? Peut-être que d'autres rencontrent le même problème.
enyo
2
Il a fallu jusqu'à PHP 5.4 pour prendre en charge la notation de tableau renvoyée par les fonctions? Quel méchant bug.
Basil Musa
Et puis vous essayez d'obtenir le premier élément d'un tableau généré par array_filter et commencez à pleurer
Loupax
17

Vous ne pouvez pas utiliser quelque chose comme ceci:

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

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

Vous devez utiliser une 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 :

  • tout d'abord, appelez votre getData()méthode et stockez sa valeur de retour dans une variable temporaire
  • puis, utilisez cette variable temporaire pour votre test

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

Pascal MARTIN
la source
Eh bien, comme je l'ai dit, mon problème est que ce code est inséré directement dans if (/ * le code va ici * /) donc définir une fonction là-bas n'est pas vraiment possible ...
enyo
Ne pouvez-vous pas affecter le résultat de l'appel de méthode à une variable avant l'instruction if et utiliser cette variable dans l'instruction if, au lieu d'essayer directement d'appeler la méthode à partir de l'instruction if?
Pascal MARTIN
1
Malheureusement non ... Il s'agit d'un moteur de création de modèles, et je n'ai aucun contrôle dessus.
enyo du
12

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

J'ai créé la fonction:

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

Et l'a utilisé comme ceci:

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

Ce n'est pas joli mais ça marche.

enyo
la source
1

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

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

myfunction() { return '($this->data[\'a\'][\'b\'] ? true : false)'; }
soulmerge
la source
Ouais désolé ... J'ai corrigé mon message: $ this-> data est privé bien sûr. J'ai également corrigé ma faute de frappe lors de la création du bogue.
enyo du
1

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

Si vous ne voulez pas de variable temporaire pour cela et que votre version de PHP est inférieure à 5.4 , 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));

Edit: !!! Veuillez noter que dans les versions ultérieures (5.4+), PHP lancera un avis, car end n'attend que des variables comme paramètre.

Lajos Meszaros
la source