Question

Est-il possible de créer une variable pointant variable à un tableau ou à des objets imbriqués? Les php docs disent spécifiquement que vous ne pouvez pas pointer vers Superglobales mais son pas clair (du moins pour moi) si cela s'applique aux tableaux en général.

Voici mon essai au tableau var var.

     // Array Example
     $arrayTest = array('value0', 'value1');
     ${arrayVarTest} = 'arrayTest[1]';
     // This returns the correct 'value1'
     echo $arrayTest[1];
     // This returns null
     echo ${$arrayVarTest};   

Voici un code simple pour montrer ce que je veux dire par objet var var.

     ${OBJVarVar} = 'classObj->obj'; 
     // This should return the values of $classObj->obj but it will return null  
     var_dump(${$OBJVarVar});    

Suis-je manque quelque chose d'évident ici?

Était-ce utile?

La solution

approche élément Array :

  • nom du tableau Extrait de la chaîne et le stocker dans $arrayName.
  • index de tableau Extrait de la chaîne et le stocker dans $arrayIndex.
  • Parse-les correctement au lieu de l'ensemble.

Le code:

$arrayTest  = array('value0', 'value1');
$variableArrayElement = 'arrayTest[1]';
$arrayName  = substr($variableArrayElement,0,strpos($variableArrayElement,'['));
$arrayIndex = preg_replace('/[^\d\s]/', '',$variableArrayElement);

// This returns the correct 'value1'
echo ${$arrayName}[$arrayIndex];

Propriétés de l'objet approche :

  • Exploser la chaîne contenant la classe et la propriété que vous souhaitez accéder par son delimiter. (->)
  • Attribuer ces deux variables à $class et $property.
  • Parse séparément au lieu de l'ensemble sur var_dump()

Le code:

$variableObjectProperty = "classObj->obj";
list($class,$property)  = explode("->",$variableObjectProperty);

// This now return the values of $classObj->obj
var_dump(${$class}->{$property});    

Il fonctionne!

Autres conseils

Utilisez = & pour attribuer par référence:

 $arrayTest = array('value0', 'value1');
 $arrayVarTest = &$arrayTest[1];

 $arrayTest[1] = 'newvalue1'; // to test if it's really passed by reference

 print $arrayVarTest;

En echo $arrayTest[1]; le nom vars est $arrayTest avec un indice de tableau de 1, et non $arrayTest[1]. Les crochets sont « mots-clés » PHP. Même avec la notation de la méthode et l'opérateur ->. Vous aurez donc besoin de se séparer.

// bla[1]
$arr = 'bla';
$idx = 1;
echo $arr[$idx];

// foo->bar
$obj = 'foo';
$method = 'bar';
echo $obj->$method;

Qu'est-ce que vous voulez faire ressemble plus à évaluer le code PHP (eval()). Mais rappelez-vous: eval est le mal. ; -)

Non, vous ne pouvez pas le faire. Vous ne pouvez le faire avec des noms de variables, objet et la fonction.

Exemple:

 $objvar = 'classObj';
 var_dump(${$OBJVarVar}->var);

Alternatives peut être via eval () ou en faisant pré-traitement.

$arrayTest = array('value0', 'value1');
$arrayVarTest = 'arrayTest[1]';

echo eval('return $'.$arrayVarTest.';');
eval('echo $'.$arrayVarTest.';');

C'est si vous êtes très sûr de ce qui va être l'entrée.

Par prétraitement:

function varvar($str){
  if(strpos($str,'->') !== false){
    $parts = explode('->',$str);
    global ${$parts[0]};
    return $parts[0]->$parts[1];
  }elseif(strpos($str,'[') !== false && strpos($str,']') !== false){
    $parts = explode('[',$str);
    global ${$parts[0]};
    $parts[1] = substr($parts[1],0,strlen($parts[1])-1);
    return ${$parts[0]}[$parts[1]];
  }else{
    return false;
  }
}

$arrayTest = array('value0', 'value1');
$test = 'arrayTest[1]';
echo varvar($test);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top