web-dev-qa-db-fra.com

Obtention de la propriété statique d'une classe avec un nom de classe dynamique dans PHP

J'ai ceci:

  • une variable chaîne contenant le nom de la classe ($classname)
  • une variable chaîne contenant le nom de la propriété ($propertyname)

Je veux obtenir cette propriété de cette classe, le problème est que la propriété est statique et je ne sais pas comment le faire.

Si la propriété n'avait pas été statique, elle aurait été:

$classname->$propertyname;

si la propriété était une méthode, j'aurais utilisé call_user_function

call_user_func(array($classname, $propertyname));

Mais dans mon cas, je suis juste perdu. J'espère cependant que c'est possible. Avec les milliers de fonctions de PHP, il aurait intérêt à en avoir un pour cela également. Peut-être que je manque quelque chose?

Merci!

Modifier:

  • pour ceux avec eval () solutions: merci, mais il est hors de question
  • pour ceux avec get _class _vars () solutions: merci, mais il semble qu'il renvoie "les propriétés par défaut de la classe donnée" (php.net), et oui, j'aimerais que cette valeur soit changable (même si cela m'aide dans certains cas)
47
treznik

Je pense que c'est le plus simple:

$foo = new ReflectionProperty('myClassName', 'myPropertyName'); 
print $foo->getValue();
13
Bahadır

Pour renvoyer une valeur de variable définie par une variable statique, vous devez appeler:

$static_value = constant($classname.'::'.$propertyname);

Consultez la documentation :: PHP Constant Documentation

10
frodosghost

'eval' semble si proche du 'mal', et je déteste l'utiliser et/ou le voir sous forme de code. Avec quelques idées provenant d'autres réponses, voici un moyen de l'éviter même si votre php n'est pas à la version 5.3 ou supérieure. 

Modifié pour refléter les tests basés sur un commentaire.

class A {
    static $foo = 'bar';
}

A::$foo = 'baz';
$a = new A;

$class = get_class($a);
$vars = get_class_vars($class);

echo $vars['foo'];

Sorties 'baz'.

1
nilamo

Une chose que j'ai remarquée est que vous ne pouvez pas définir de variables protégées dans des classes statiques car la commande eval () s'exécute dans une étendue en dehors de la classe. La seule chose à faire serait de mettre en œuvre une méthode statique dans la classe/every qui exécute eval (). Cette méthode peut être protégée car call_user_func () [pour appeler la méthode setter] s'exécute également depuis l'intérieur de la classe.

1
mbirth

get_class_vars n'est pas identique à get_object_vars.

Je pense que get_clas_vars devrait renvoyer les valeurs de propriété d'origine.

0
firzen

Même si pour vous, eval était hors de question, avant PHP 5.3, la solution la plus simple consiste à utiliser eval:

eval("\$propertyval = $classname::\$propertyname;");
echo $propertyval;
0
Marco Demaio

Potentiellement pertinent: discussion sur la liaison statique tardive dans PHP - Quand faut-il utiliser une liaison statique tardive?

0
Alex Weinstein

Vous pouvez utiliser ReflectionClass:

class foo
{
    private static $bar = "something";
}

$class = "foo";
$reflector = new ReflectionClass($class);
$static_vars = $reflector->getStaticProperties();
var_dump($static_vars["bar"]);
0
Garlou

Vous devriez pouvoir faire quelque chose comme:

eval("echo $classname::$propertyname;");

Je viens de faire un test rapide et cela a fonctionné pour moi. Je ne sais pas s'il existe un meilleur moyen ou non, mais je n'ai pas pu en trouver un.

0
Steven Surowiec