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

标签 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
  }
}

我知道您可以使用 __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/

相关文章:

php - 如何在 propel 中创建一个新的事务范围

Java反射,获取泛型类参数的名称

c# - 从类调用寻呼

c++ - 内存中静态方法和非静态函数的区别

javascript - 从回调中访问对象的属性

python - 维护Python中对象之间的关系

php - htaccess 创建集中的 php 文件

javascript - DataTables服务器端处理添加html内容选择标签不触发javascript

php - Symfony 有弱点吗?

python - 如何在Python中从现有的父类(super class)类型对象实例化子类类型变量