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
另一种可以使用 \
斜杠的情况是为了加快解析速度(如 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 它可以检查你的整个项目并为你找到这些优化。
继承了一个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
另一种可以使用 \
斜杠的情况是为了加快解析速度(如 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 它可以检查你的整个项目并为你找到这些优化。