继承了一个PHP7项目。以前的开发人员在所有标准 PHP 函数中添加了一个斜线,即使是 \true。这样做有什么理由吗?
一些例子:
\array_push($tags, 'master');
if ($result === \true) {}
$year = \date('Y');
切换此选项的 php-cs-fixer 规则是什么?
继承了一个PHP7项目。以前的开发人员在所有标准 PHP 函数中添加了一个斜线,即使是 \true。这样做有什么理由吗?
一些例子:
\array_push($tags, 'master');
if ($result === \true) {}
$year = \date('Y');
切换此选项的 php-cs-fixer 规则是什么?
您可以使用斜杠来确保您使用的是原生 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
演示: https ://ideone.com/3xoFhm
您可以使用斜线的另一种情况\
是加快解析速度(如 PHP-CS-Fixer 文档中所述)。PHP 不需要使用自动加载器来查找函数或常量声明。所以有了领先的\
PHP就可以使用native函数而不需要额外的检查。
native_function_invocation
您可以使用(for functions) 和native_constant_invocation
(for constants) 选项在 PHP-CS-Fixer 上切换此选项。您可以在以下页面上找到有关选项的说明:https ://github.com/FriendsOfPHP/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 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
上面的答案回答了你的第一部分,至于 cs-fixer 的选项是:
native_function_invocation
和
native_constant_invocation
因为命名空间。
添加\
将从全局空间中查找名称。
这是一个例子:
<?php
namespace Foo;
function time() {
return "my-time";
}
echo time(), " vs", \time();
你会得到这样的结果:</p>
my-time vs 1553870392
给原生 PHP 函数加上前缀\
将指定全局命名空间需要它。
从 PHP 7 开始,如果使用 FQDN 调用某些本机函数,它们将被操作码替换。无论如何,OpCache 是 PHP 7 的热门话题。
不过,并非所有原生 PHP 函数都需要这个。
对于那些使用 PHPStorm 的人,我推荐Php Inspections (EA Extended) 插件,它可以检查您的整个项目并为您找到这些优化。