【发布时间】:2016-02-09 11:36:39
【问题描述】:
在配置文件中,我想定义一个可以在以后实例化的类列表,例如用于验证输入的类列表:
// 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
}
}
我知道您可以使用Possible to get name of current class from an uninstantiated object in PHP? 中指出的__CLASS__ 或get_called_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() 时失败。
这可能吗?
【问题讨论】:
-
无法实例化abstract。
-
所以你想实例化每一个可用的类?您可能需要以某种方式标记要为其创建对象的那些类。如果您需要可用课程的列表,请查看
get_declared_classes ()。 -
你用的是哪个版本的php?
-
不,我想实例化
Config文件类中定义的类列表。Config类文件是不可实例化/静态的(因此它是抽象的)。 PHP版本是5.6。 -
用一个例子更新了问题,应该更清楚地解释我想要实现的目标。