在配置文件中,我想定义一个可以在以后实例化的类列表,例如用于验证输入的类列表:
// 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()
时。
这可能吗?
答案 0 :(得分:2)
不确定我是否正确理解了您的问题,但也许您正在寻找类似的内容( 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',
)
答案 1 :(得分:0)
您可以使用reflection
类...
// 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
}
}
$reflection = new ReflectionClass('Config');
$staticProperties = $reflection->getStaticProperties();
foreach ($staticProperties as $name => $value) {
var_dump($name, $value);
}
string 'validators' (length=10)
array (size=2)
0 => string 'FooValidator' (length=12)
1 => string 'BarValidator' (length=12)