我想动态声明类(= 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);
)吗?
答案 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的反射功能