在配置文件中,我想定义一个可以稍后实例化的类列表,例如用于验证输入的类列表:
// Config file
abstract class Config {
public static $validators = array(
FooValidator,
BarValidator,
);
}
// Validation at later time
function validate_input($input){
foreach (Config::$validators as $validatorClassName){
$validator = new $validatorClassName();
$result = $validator->validate($input);
// Do stuff with result
}
}
我知道您可以使用 __CLASS__
或 get_used_class()
,如 Possible to get name of current class from an uninstantiated object in PHP? 中指出的。 ,但那些只在类(class)内部起作用。
解决方法是在每个类中定义一个常量,例如:
class FooValidator {
const CLASS_NAME = __CLASS__;
public function validate($input){
// Validate $input
}
}
然后将列表定义为
abstract class Config {
public static $classes = array(
FooValidator::CLASS_NAME,
BarValidator::CLASS_NAME,
);
}
但是,我想避免这样做,因为它增加了一个故障点,这对于其他开发人员查看我的代码来说并不直观。
为什么我不只使用你问的类字符串名称列表?主要是因为我希望 PHP 在加载 Config
时(使用不存在的验证器类)失败,而不是仅在调用 validate_input()
时失败。
这可能吗?
最佳答案
不确定我是否正确理解了您的问题,但也许您正在寻找类似的东西(PHP >= 5.5):
<?php
namespace Configs;
class Foo {}
class Bar {}
class Config {
public static $classes = array(
Foo::class,
Bar::class,
);
}
var_export(Config::$classes);
将打印:
array (
0 => 'Configs\\Foo',
1 => 'Configs\\Bar',
)
关于php - 如何获取未实例化的类(类外)的类名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35291068/