class Google_Model_SomeThing { ... }
$className = 'google_MODEL_something';
我可以在$ className上创建类的实例。但是,如果我想在不创建实例的情况下从$ className获取正确的案例类名称呢?
我期待这样的事情:
echo func('google_MODEL_something'); // Google_Model_SomeThing
或
$className = 'google_MODEL_something';
echo $className::class; // Google_Model_SomeThing
答案 0 :(得分:1)
反射可能是一个更好的选择,但这是替代方法:
您可以在调用class_exists($wrongCaseName)
之后使用get_declared_classes
并在已声明的类的数组中找到类名。
示例:
$wrongCaseName = 'Some\classy\THIng';
class_exists($wrongCaseName); //so it gets autoloaded if not already done
$classes = get_declared_classes();
$map = array_combine(array_map('strtolower',$classes),$classes);
$proper = $map[strtolower($wrongCaseName)];
以反射为基础的方法(以100k表示)明显快了大约3倍。我在500个不同的类上运行了该版本与反射版本,它们具有随机生成的名称,并且其中没有代码。反射方法大约需要0.015秒才能获得500个类别的正确情况,而我的get_declared_classes
方法大约需要500个类别的0.050秒。
更多详细信息on my personal website。在便携式计算机上的本地主机服务器上的PHP 7.2.19上进行了测试。
答案 1 :(得分:0)
我建议创建一个实例,然后使用get_class().
获取className$bar = new $classname();
$caseClassName = get_class($bar);
答案 2 :(得分:0)
我发现下面的代码工作正常,但这是最简单的解决方案吗?
$className = 'google_MODEL_something';
$reflection = new ReflectionClass($className);
echo $reflection->getName(); // Google_Model_SomeThing