继承了一个PHP7项目。前一个开发人员为所有标准PHP函数添加了斜杠,即使对于\ true也是如此。这样做有什么理由吗?
一些例子:
\array_push($tags, 'master');
if ($result === \true) {}
$year = \date('Y');
什么是php-cs-fixer规则来切换这个选项?
正如其他答案所指出的那样,使用\
为全局或内置函数和常量加前缀可确保它们不会被当前名称空间中的声明所覆盖。具有相同效果的替代方法是在文件顶部添加use function foo;
和use constant foo;
行。
在大多数情况下,这是不必要的,因为PHP将回退到不存在命名空间本地版本的全局/内置版本,但是在少数情况下,如果PHP事先知道正在使用哪个版本,则存在性能优势(在PHP-CS-Fixer中查看issue 3048和issue 2739)。
在PHP-CS-Fixer中控制它的选项是native_function_invocation
。
您可以使用斜杠来确保使用本机PHP函数或常量,而不是使用在项目命名空间中定义的相同名称的函数/常量。
namespace test;
function array_push($arr, $str) {
return $str;
}
$arr = [];
var_dump(array_push($arr, 'Hello World')); // array_push defined in namespace test
var_dump(\array_push($arr, 'Hello World')); // native array_push function
但是:ぁzxswい
另一个可以使用https://ideone.com/3xoFhm斜杠的情况是加速解析(如PHP-CS-Fixer文档中所述)。 PHP不需要使用自动加载器来查找函数或常量声明。因此,使用领先的\
PHP可以使用本机功能而无需额外检查。
您可以使用\
(用于函数)和native_function_invocation
(用于常量)选项在PHP-CS-Fixer上切换此选项。您可以在下页找到有关选项的说明:native_constant_invocation
上面的答案回答了你的第一部分,对于cs-fixer,选项是:
https://github.com/FriendsOfPHP/PHP-CS-Fixer
和
native_function_invocation
因为命名空间。
添加native_constant_invocation
将从全球空间中找到名称。
这是一个例子:
\
你会得到这样的结果:
<?php
namespace Foo;
function time() {
return "my-time";
}
echo time(), " vs", \time();
这也可能是因为表现。从根命名空间直接调用它时性能要快得多。
my-time vs 1553870392
使用<?php
namespace App;
class Test
{
public function test()
{
$first = microtime(true);
for ($i = 0; $i <= 5000; $i++) {
echo number_format($i).PHP_EOL;
}
echo microtime(true) - $first;
}
public function testNative()
{
$first = microtime(true);
for ($i = 0; $i <= 5000; $i++) {
echo \number_format($i).PHP_EOL;
}
echo microtime(true) - $first;
}
}
$t = new Test();
//$t->test();
//0.03601598739624
$t->testNative();
//0.025378942489624
为本机PHP函数添加前缀将指定\
需要它。
从PHP 7开始,如果使用FQDN调用global namespace,则some native functions将替换为操作码。无论如何,OpCache是关于PHP 7的热门话题。
绝不是所有本机PHP函数都需要这个。
对于那些使用PHPStorm的人,我推荐Php Inspections (EA Extended) plugin,它可以检查整个项目并为您找到这些优化。