PHP如何获得正确的案例类名称

时间:2016-02-05 10:53:57

标签: php

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

3 个答案:

答案 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