从PHP 5.5开始,有一个特性可以使用内置的魔术常量class
来获取完整命名空间的类名。例如:
<?php
namespace Something\Obscenely\Long\Hard\To\Type;
class MyClass {
}
echo MyClass::class;
// Output: Something\Obscenely\Long\Hard\To\Type\MyClass
?>
以下是文档和RFC链接: http://php.net/oop5.basic#language.oop5.basic.class.class https://wiki.php.net/rfc/class_name_scalars 问题是:
如果我使用Zend Framework 2,例如,它被认为是一个具有巨大PHP数组配置的框架,如果我对每个类名在这些配置中使用解析方法
::class
而不是像字符串一样键入完整名称''
,是否会有可观的性能影响?例如:
'controllers' => [
'invokables' => [
'\Controller\Monitor' => 'Import\Controller\MonitorController',
...
vs
'controllers' => [
'invokables' => [
'\Controller\Monitor' => MonitorController::class,
...
更新:
我的个人测试
我编写了简单的快速测试来进行基准测试。
class MyClass
{
}
class MyClass1
{
}
class MyClass2
{
}
class MyClass3
{
}
/**
* run many iteration loop for test percentage
*/
function testString()
{
$results = [];
for ($i = 0; $i < 150000; $i++) {
$results[] = [
'controllers' => [
'invokables' => [
'\Controller\Monitor' => 'Import\Controller\MonitorController',
'\Controller\Monitor2' => 'Import\Controller\MonitorController2',
'\Controller\Monitor3' => 'Import\Controller\MonitorController3',
'\Controller\Monitor4' => 'Import\Controller\MonitorController4',
]
]
];
}
return $results;
}
function testClass()
{
$results = [];
for ($i = 0; $i < 150000; $i++) {
$results[] = [
'controllers' => [
'invokables' => [
'\Controller\Monitor' => MyClass::class,
'\Controller\Monitor2' => MyClass1::class,
'\Controller\Monitor3' => MyClass2::class,
'\Controller\Monitor4' => MyClass3::class,
]
]
];
}
return $results;
}
$token = Benchmark::start('testString');
testString();
Benchmark::end($token);
$token = Benchmark::start('testClass');
testClass();
Benchmark::end($token);
exit();
结果类似于:
testString
215335.203125 Kbytes
Time: 0.2604 Seconds
testClass
215337.1640625 Kbytes
Time: 0.2508 Seconds
我们可以看到,
::class
更快。在最新的php5.6下运行。这是真的吗?
P.S. 这不是 How to measure PHP code 的重复问题:
1. 搜索引擎中没有我所问的信息。 2. 我不知道如何在这个问题上下文中测量性能,因为对于这种情况,仅运行基准测试是不够的并且困难的。 3. 在实际项目配置文件中更改成千上万行的代码不简单。 4. 我想要更详细的答案 - 不仅仅是数字,还要包括原因。