J'ai ceci:
$classname
)$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:
Je pense que c'est le plus simple:
$foo = new ReflectionProperty('myClassName', 'myPropertyName');
print $foo->getValue();
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
'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'.
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.
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.
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;
Potentiellement pertinent: discussion sur la liaison statique tardive dans PHP - Quand faut-il utiliser une liaison statique tardive? .
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"]);
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.