PHP7 Добавление косой черты ко всем стандартным функциям php правило php-cs-fixer - PullRequest
6 голосов
/ 29 марта 2019

Унаследованный проект PHP7.Предыдущий разработчик добавил косую черту ко всем стандартным функциям PHP даже для \ true.Есть ли причина для этого?

Некоторые примеры:

\array_push($tags, 'master');

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

$year = \date('Y');

Что такое правило php-cs-fixer для переключения этой опции?

Ответы [ 6 ]

6 голосов
/ 29 марта 2019

Вы можете использовать косую черту, чтобы убедиться, что вы используете нативную функцию или константу 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

5 голосов
/ 29 марта 2019

Как указывалось в других ответах, префикс глобальных или встроенных функций и констант с \ гарантирует, что они не будут переопределены объявлениями в текущем пространстве имен.Альтернативой с тем же эффектом является добавление строк use function foo; и use constant foo; вверху файла.

В большинстве случаев это не нужно, поскольку PHP откатится к глобальной / встроенной версиигде не существует локальной версии пространства имен, но есть несколько случаев, когда есть преимущество в производительности, если PHP заранее знает, какой из них используется (см. выпуск 3048 и выпуск 2739 в PHP-CS-Fixer).

Опция для управления этим в PHP-CS-Fixer: native_function_invocation.

2 голосов
/ 29 марта 2019

Это также могло быть из-за производительности. При вызове напрямую из корневого пространства имен производительность значительно выше.

<?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
2 голосов
/ 29 марта 2019

Из-за пространства имен.

Добавить \ найдет имя из глобального пространства.

Вот пример:

<?php

namespace Foo;

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

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

Вы получите такой результат:

my-time vs 1553870392
2 голосов
/ 29 марта 2019

Приведенный выше ответ отвечает на вашу первую часть, так как для cs-fixer варианты:

native_function_invocation

и

native_constant_invocation
0 голосов
/ 05 апреля 2019

Префикс собственной функции PHP с \ будет указывать, что она требуется из глобального пространства имен .

Начиная с PHP 7, некоторые встроенные функции заменяются кодами операций, если они вызываются с использованием полного доменного имени.OpCache в любом случае является горячей темой, когда речь заходит о PHP 7.

Хотя это не обязательно для всех нативных функций PHP.

Для тех, кто использует PHPStorm, я рекомендую PhpПлагин Inspections (EA Extended) , который может проверить весь ваш проект и найти эти оптимизации для вас.

...