获取最后声明的类的名称

时间:2015-02-19 08:24:57

标签: php class

我想动态声明类(= require .php文件),但我需要知道,实际定义了哪个类(我需要的只是名称)。我目前的解决方案是:

$classesBefore = get_declared_classes();
require_once $someToken'.php'; // it's actualy more complex than this...
$classesAfter = get_declared_classes();

$classesDiff = array_diff($classesAfter, $classesBefore);
$declaredClass = end($classesDiff);

echo $declaredClass; // here is name of currently declared class

这可以做得更有效吗?如果没有,我可以确定最后定义的类将在定义的类列表中是最后一个(因为$declaredClass = end($classesDiff);)吗?

2 个答案:

答案 0 :(得分:0)

还有另一个帖子here提供其他解决方案来执行您正在寻找的内容。这是该帖子的片段:

function file_get_php_classes($filepath) {
  $php_code = file_get_contents($filepath);
  $classes = get_php_classes($php_code);
  return $classes;
}

function get_php_classes($php_code) {
  $classes = array();
  $tokens = token_get_all($php_code);
  $count = count($tokens);
  for ($i = 2; $i < $count; $i++) {
    if (   $tokens[$i - 2][0] == T_CLASS
        && $tokens[$i - 1][0] == T_WHITESPACE
        && $tokens[$i][0] == T_STRING) {

        $class_name = $tokens[$i][1];
        $classes[] = $class_name;
    }
  }
  return $classes;
}

答案 1 :(得分:0)

可以更轻松地完成:

require_once $someToken'.php';
$last_class = array_pop(get_declared_classes());
  

*编辑:   正如在这篇文章的评论中所写,这可以提出通知。   这可以通过再使用一行来防止:

$all_classes = get_declared_classes();
$last_class = array_pop($all_classes);

感谢提示。

当然你也可以使用end()而不是array_pop()。这应该是相同的。

作为替代方案,您可以使用此代码段来获取最后声明的类:

require_once $someToken'.php';
$all_classes = get_declared_classes();
$all_classes_rev = array_reverse($all_classes);
$last_class = $all_classes_rev[0];

哪种不那么优雅。

回到第一种方法: array_pop(get_declared_classes())为您带来最后声明的类

当然这不包括在调用array_pop之前定义多个类的情况(get_declared_classes()) 因此,每当你包括一个新的课程时,必须使用上面的一行,这使得它不是&#34; D.R.Y&#34;。因此,您应该考虑另一种解决该问题的方法。

这是一种更加优雅的完全不同的方式:

创建一个可用于注册新类的Helper类:

/* the helper: */
class MyDefinedClasses {
  $classes = array();

  public static function register_class($class){
    self::$classes[] = $class
  }

  public static function get_registered_classes(){
    return self::$classes;
  }
}
/*helper ends here*/

这里有一个类作为这样的例子,你包括并写下你的自己:

/*misc function class to be registered*/
class MyFunctions {
  public ....
}
myDefinedClasses::register_class(new MyFunctions()); // this is where the alternative approach of solving your problem kicks in
/*(php)file ends here*/

现在,您始终可以通过调用myDefinedClasses :: get_registered_classes();

来获取所有自定义和注册的类。

最好的一点:你直接得到一个类实例而不使用php的反射功能