【问题标题】:How to get the class name of an uninstantiated class (outside the class)?如何获取未实例化类(类外)的类名?
【发布时间】: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。
  • 用一个例子更新了问题,应该更清楚地解释我想要实现的目标。

标签: php class oop object


【解决方案1】:

不确定我是否正确理解了您的问题,但也许您正在寻找这样的东西(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',
)

【讨论】:

  • 我也遇到了::class,但您似乎可以在::class 后面输入任何内容,这将是有效代码,例如NonexistantClass::class
  • 是的,你是对的,但你可以在创建新的实例检查类之前使用 class_exists
【解决方案2】:

您可以为此使用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)

【讨论】:

    猜你喜欢
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 2021-10-14
    相关资源
    最近更新 更多