如何获取未实例化类的类名(在类外)?

时间:2016-02-09 11:36:40

标签: php class oop object

在配置文件中,我想定义一个可以在以后实例化的类列表,例如用于验证输入的类列表:

// 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()时。

这可能吗?

2 个答案:

答案 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)