从PHP中使用动态类名获取静态属性

tre*_*nik 49 php oop static properties dynamic

我有这个:

  • 一个字符串变量,它包含类名($classname)
  • 一个字符串变量with保存属性名称($propertyname)

我想从该类中获取该属性,问题是,属性是静态的,我不知道该怎么做.

如果属性不是静态的,那将是:

$classname->$propertyname;
Run Code Online (Sandbox Code Playgroud)

如果属性是一个方法,我可以使用call_user_function

call_user_func(array($classname, $propertyname));
Run Code Online (Sandbox Code Playgroud)

但就我而言,我只是输了.但我希望这是可能的.有了PHP拥有的数千个函数,他最好还有一些东西.也许我错过了什么?

谢谢!

编辑:

  • 对于那些有eval()解决方案的人:谢谢,但这是不可能的
  • 对于那些使用get _class _vars()解决方案的人:谢谢,但似乎它返回"给定类的默认属性"(php.net),是的,我希望这个值可以变化(即使它确实帮助了我在某些情况下)

And*_*ore 75

如果您使用的是PHP 5.3.0或更高版本,则可以使用以下命令:

$classname::$$propertyname;
Run Code Online (Sandbox Code Playgroud)

不幸的是,如果您使用的是低于5.3.0的版本,那么您将无法使用eval()(get_class_vars()如果值是动态的,则无效).

$value = eval($classname.'::$'.$propertyname.';');
Run Code Online (Sandbox Code Playgroud)


编辑:我刚才说get_class_vars(),如果值是动态的,那将无效,但显然,变量静态成员是"类的默认属性"的一部分.您可以使用以下包装器:

function get_user_prop($className, $property) {
  if(!class_exists($className)) return null;
  if(!property_exists($className, $property)) return null;

  $vars = get_class_vars($className);
  return $vars[$property];
}

class Foo { static $bar = 'Fizz'; }

echo get_user_prop('Foo', 'bar'); // echoes Fizz
Foo::$bar = 'Buzz';
echo get_user_prop('Foo', 'bar'); // echoes Buzz
Run Code Online (Sandbox Code Playgroud)

不幸的是,如果你想设置变量的值,你仍然需要使用eval(),但是通过一些验证,它并不是那么邪恶.

function set_user_prop($className, $property,$value) {
  if(!class_exists($className)) return false;
  if(!property_exists($className, $property)) return false;

  /* Since I cannot trust the value of $value
   * I am putting it in single quotes (I don't
   * want its value to be evaled. Now it will
   * just be parsed as a variable reference).
   */
  eval($className.'::$'.$property.'=$value;');
  return true;
}

class Foo { static $bar = 'Fizz'; }

echo get_user_prop('Foo', 'bar'); // echoes Fizz
set_user_prop('Foo', 'bar', 'Buzz');
echo get_user_prop('Foo', 'bar'); // echoes Buzz
Run Code Online (Sandbox Code Playgroud)

set_user_prop()这种验证应该是安全的.如果人们开始把随机事物作为$className$property,它将退出函数,因为它不会是现有的类或属性.从那时起$value,它实际上从未被解析为代码,因此无论它们放在哪里都不会影响脚本.


小智 16

我认为这是最简单的:

$foo = new ReflectionProperty('myClassName', 'myPropertyName'); 
print $foo->getValue();
Run Code Online (Sandbox Code Playgroud)


fro*_*ost 13

要返回由静态变量设置的变量值,您需要调用:

$static_value = constant($classname.'::'.$propertyname);
Run Code Online (Sandbox Code Playgroud)

查看文档:: PHP常量文档

  • 提示+1.但我认为它只适用于类常量而不是类静态变量. (2认同)
  • 我测试过,它仅适用于类常量,但不适用于类静态变量. (2认同)