我有这个:
$classname
)$propertyname
)的字符串变量我想从该类中获取该属性,问题是该属性是静态的,我不知道该怎么做。
如果该属性不是静态的,则可能是:
$classname->$propertyname;
如果属性是一个方法,我本可以使用call_user_function
call_user_func(array($classname, $propertyname));
但就我而言,我只是迷路了。但是,我希望这是可能的。有了PHP所具有的数千个功能,他最好为此也有所准备。也许我缺少什么?
谢谢!
编辑:
如果您使用的是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对象为空吗?我知道我可以将其作为方法参数传递,但这不是很好。我猜想自动装配不能在静态对象上使用,因为它们尚