PHP 如何获取正确的案例类名


PHP How to get proper case class name

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

反射很可能是更好的选择,但这里有一个替代方案:

您可以在调用 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)];

性能

l00k指出的基于反射的方法明显更快,大约快了3倍。我在 500 个不同的类上运行了这个版本与反射版本,这些类具有随机生成的名称,并且其中没有代码。反射方法大约需要 0.015 秒才能获得 500 个类的正确案例,而我的get_declared_classes方法对于 500 个类大约需要 0.050 秒。
更多详情请见我的个人网站。在我的笔记本电脑上的本地主机服务器上在 PHP 7.2.19 上进行了测试。

我发现下面的代码可以工作,但它是最简单的解决方案吗?

$className = 'google_MODEL_something';
$reflection = new ReflectionClass($className);
echo $reflection->getName(); // Google_Model_SomeThing
<</div> div class="answers">

好吧,我建议创建一个实例,然后使用 get_class() 获取类名。

$bar = new $classname();
$caseClassName = get_class($bar);