PHP7 向所有标准 php 函数添加斜线 php-cs-fixer 规则

PHP7 Adding a slash to all standard php functions php-cs-fixer rule

继承了一个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 可以使用本机函数而无需额外检查。


您可以在 PHP-CS-Fixer 上使用 native_function_invocation(对于函数)和 native_constant_invocation(对于常量)选项切换此选项。您可以在以下页面找到选项的解释:https://github.com/FriendsOfPHP/PHP-CS-Fixer

以上答案回答了你的第一部分,至于 cs-fixer 选项是:

native_function_invocation

native_constant_invocation

因为名字space。

添加 \ 将从全局 space.

中查找名称

这是一个例子:

<?php

namespace Foo;

function time() {
    return "my-time";
}

echo time(), " vs", \time();

你会得到这样的结果:

my-time vs 1553870392

正如其他答案所指出的那样,在全局或内置函数和常量前加上 \ 可以确保它们不会被当前命名空间中的声明覆盖。具有相同效果的替代方法是在文件顶部添加 use function foo;use constant foo; 行。

在大多数情况下,这是不必要的,因为 PHP 将回退到不存在名称空间本地版本的全局/内置版本,但在少数情况下,如果PHP 预先知道正在使用哪个(请参阅 PHP-CS-Fixer 中的 issue 3048 and 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

为原生 PHP 函数加上 \ 前缀将指定它是 global namespace 所必需的。

从 PHP 7 开始,如果使用 FQDN 调用,some native functions 将被操作码替换。无论如何,OpCache 是 PHP 7 的热门话题。

尽管并非所有原生 PHP 函数都需要这个。

对于那些使用 PHPStorm 的人,我推荐 Php Inspections (EA Extended) plugin 它可以检查你的整个项目并为你找到这些优化。