gpt4 book ai didi

php - 在 PHP 中从具有动态类名的类中获取静态属性

转载 作者:IT王子 更新时间:2023-10-29 00:48:16 25 4
gpt4 key购买 nike

我有这个:

  • 一个包含类名的字符串变量($classname)
  • 一个字符串变量,其中包含属性名称 ($propertyname)

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

如果属性不是静态的,它会是:

$classname->$propertyname;

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

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

但就我而言,我只是迷路了。然而,我希望这是可能的。 PHP 有成千上万的函数,他最好也有一些这方面的东西。也许我遗漏了什么?

谢谢!

编辑:

  • 对于 eval() 的人解决方案:谢谢,但这是不可能的
  • 对于 get _class _vars() 的人解决方案:谢谢,但它似乎返回“给定类的默认属性” (php.net),是的,我希望该值可以更改(即使它确实帮助我一些案例)

最佳答案

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

$classname::$$propertyname;

<罢工>不幸的是,如果您使用的版本低于 5.3.0,您将无法使用 eval()。 (如果值是动态的,get_class_vars() 将不起作用)。

$value = eval($classname.'::$'.$propertyname.';');

<罢工>


编辑:我刚才说了 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

不幸的是,如果你想设置变量的值,你仍然需要使用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
具有此验证的

set_user_prop()应该是安全的。如果人们开始将随机的东西作为 $className$property,它将退出函数,因为它不是现有的类或属性。从 $value 开始,它实际上从未被解析为代码,因此无论它们放入其中都不会影响脚本。

关于php - 在 PHP 中从具有动态类名的类中获取静态属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1279081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com