【问题标题】:PHP How to get proper case class namePHP如何获得正确的案例类名
【发布时间】:2016-05-15 07:43:34
【问题描述】:
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

【问题讨论】:

  • 这里stackoverflow.com/questions/5260168/…。 PHP 在类命名中不区分大小写。
  • 就像我在我的问题中指出的那样:我可以创建实例 - PHP 在使用类名时不区分大小写。但是如何获得正确的案例类名?
  • 这取决于你想从哪里得到它?

标签: php


【解决方案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)];

性能

l00k 指出的基于反射的方法要快得多,大约快 3 倍。我在 500 个不同的类上运行此版本与反射版本,这些类具有随机生成的名称且其中没有代码。反射方法花费了大约 0.015 秒来获得 500 个类的正确案例,而我的 get_declared_classes 方法花费了大约 0.050 秒来处理 500 个类。
更多详情on my personal website。在我的笔记本电脑上的本地主机服务器上测试 PHP 7.2.19。

【讨论】:

  • 有趣的想法,但我不确定性能影响如何。
  • 我可能会做一些测试,看看这与反射之间的性能差异。我很好奇。可能取决于声明的类的数量。也不确定反射的性能如何。我会更新我的结果
  • @l00k,反射要快得多。约3倍。答案已更新。它们都非常快,但如果您想减少碳足迹,反射看起来是不错的选择。
  • 干得好!用于评论的占位符。
【解决方案2】:

我发现下面的代码有效,但它是最简单的解决方案吗?

$className = 'google_MODEL_something';
$reflection = new ReflectionClass($className);
echo $reflection->getName(); // Google_Model_SomeThing

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 是的,这是最简单的解决方案。但我不能使用它,因为性能方面。构建可能需要太多时间。
    • 我需要正确案例的类不一定有空的构造函数。有些人会。有些没有。这是我在网上搜索之前尝试的第一件事!
    猜你喜欢
    • 2011-02-09
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多