PHP7 Добавление косой черты ко всем стандартным функциям php Правило php-cs-fixer

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

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

\array_push($tags, 'master');

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

$year = \date('Y');

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


person Yada    schedule 29.03.2019    source источник
comment
Ok. Я понимаю причину этого. Какое правило в php-cs-fixer для этого?   -  person Yada    schedule 29.03.2019


Ответы (6)


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

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

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

person IMSoP    schedule 29.03.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

person Sebastian Brosch    schedule 29.03.2019
comment
Спасибо. это имеет смысл. Можно переопределить\true? - person Yada; 29.03.2019
comment
@Yada - насколько я знаю, это невозможно (не смог найти способ). Но возможно с какими-то расширениями или специальными настройками. - person Sebastian Brosch; 29.03.2019
comment
@Yada Это невозможно в PHP 7, но более ранние версии позволяли вам делать это с помощью define(), например: namespace MyNamespace; define('MyNamespace\true', false); var_dump(true); - person IMSoP; 29.03.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
person Daan    schedule 29.03.2019
comment
Спасибо, что поделился. Это значительное улучшение ~ 30%. - person Yada; 29.03.2019
comment
Не начиная с PHP 7.4. Вызов встроенной функции с `\` в начале или без него одинаков для времени выполнения и использования памяти. - person Edhrendal; 28.06.2021

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

native_function_invocation

а также

native_constant_invocation
person Lulceltech    schedule 29.03.2019

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

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

Вот пример:

<?php

namespace Foo;

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

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

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

my-time vs 1553870392
person StevenTan    schedule 29.03.2019

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

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

Однако ни в коем случае это не нужно всем нативным функциям PHP.

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

person Yes Barry    schedule 05.04.2019