8

继承了一个PHP7项目。以前的开发人员在所有标准 PHP 函数中添加了一个斜线,即使是 \true。这样做有什么理由吗?

一些例子:

\array_push($tags, 'master');

if ($result === \true) {}

$year = \date('Y');

切换此选项的 php-cs-fixer 规则是什么?

4

6 回答 6

7

您可以使用斜杠来确保您使用的是原生 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

于 2019-03-29T14:34:13.193 回答
7

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

在大多数情况下,这是不必要的,因为 PHP 将回退到不存在命名空间本地版本的全局/内置版本,但在少数情况下,如果 PHP 提前知道正在使用哪个版本,则会有性能优势(请参阅PHP-CS-Fixer 中的issue 3048issue 2739)。

在 PHP-CS-Fixer 中控制这个的选项是native_function_invocation.

于 2019-03-29T14:42:49.827 回答
3

这也可能是因为性能。当直接从根命名空间调用它时,性能要快得多。

<?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
于 2019-03-29T14:43:24.180 回答
2

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

native_function_invocation

native_constant_invocation
于 2019-03-29T14:36:29.047 回答
2

因为命名空间。

添加\将从全局空间中查找名称。

这是一个例子:

<?php

namespace Foo;

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

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

你会得到这样的结果:</p>

my-time vs 1553870392
于 2019-03-29T14:41:04.023 回答
1

给原生 PHP 函数加上前缀\将指定全局命名空间需要它。

从 PHP 7 开始,如果使用 FQDN 调用某些本机函数,它们将被操作码替换。无论如何,OpCache 是 PHP 7 的热门话题。

不过,并非所有原生 PHP 函数都需要这个。

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

于 2019-04-05T14:47:21.703 回答