当前位置: 首页 > 面试题库 >

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

龚博涛
2023-03-14
问题内容

我有这个:

  • 一个字符串变量,其中包含类名($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,它实际上从未解析为代码,因此无论它们放在那里都不会影响脚本。



 类似资料:
  • 问题内容: 我有两节课:和。后者声明为: 我需要的只是类中的方法(仅在其中,因为会有很多继承的类,而且我不想在所有这些类中都实现此方法),它将从静态调用返回类名。这是我在说的: 当我称它为: 但是父类中的每个声明只能访问父类变量,该变量的值为“ Action”。 有什么可行的方法吗? 问题答案: 总是返回使用该类的类的名称,因此使用静态方法并没有太大帮助。如果该方法不是静态的,则可以简单地使用ge

  • 问题内容: 如何从该类的静态方法获取该类的名称。例如 为了把它放在上下文中,我实际上想返回类名,作为异常中消息的一部分。 问题答案: 为了支持正确的重构(重命名类),则应使用以下任一方法: 或(感谢):

  • 我正在尝试获取一些类属性的类型,以便强烈键入我的静态编程语言代码。在打字稿中,我们可以这样做(愚蠢的例子,但这是为了解释) 这样做的好处是,如果我需要更改“_prop”的类型,不需要重构整个代码,因为类型是通过< code>Test["_prop"]找到的。在科特林有办法做到这一点吗? 我在Kotlin中见过反射函数,但无法得到我想要的 科特林代码:

  • 问题内容: 我在构建ORM库时要考虑到重用和简单性。一切都进行得很好,除了我被愚蠢的继承限制所困。请考虑以下代码: 显然,这不是我所期望的行为(尽管实际行为也很有意义)。因此,我的问题是,你们是否知道在父类中获得子类名称的意思。 问题答案: 简而言之。这不可能。在php4中,您可以实施可怕的破解(检查),但是该方法在PHP5中不起作用。参考资料: 37684 34421 编辑 :PHP 5.3中后

  • 是否有可能在Kotlin 属性初始化之前从其获取< code>::class.java? 从逻辑上讲,它应该可以工作——我试图获取一个类而不是一个值,但实际上它在未初始化的属性访问异常时失败。 请注意,我试图获取类的属性位于泛型类中,其类型是泛型参数之一: 我需要这个类来创建的实例 当然,我不能做到: 对此有什么解决办法吗?

  • 问题内容: 这是Hibernate的Spring MVC项目。我正在尝试制作一个Logger类,该类负责将日志输入数据库。其他类只是调用具有某些属性的适当方法,而该类应该发挥所有魔力。从本质上讲,它应该是带有静态方法的类,但是这会导致自动装配dao对象出现问题。 如何使它正确?我不应该使dao对象为空吗?我知道我可以将其作为方法参数传递,但这不是很好。我猜想自动装配不能在静态对象上使用,因为它们尚