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


я Заметил, что некоторые библиотеки часто используют в роли родного PHP \, например:

echo \str_replace('foo', 'test', $string);

Я пошел проверить в классе только с имен это:

public function foo($string)
{
    echo \str_replace('foo', 'test', $string);
}

И

public function foo($string)
{
    echo str_replace('foo', 'test', $string);
}

Оба работали отлично, без проблем.

Я понимаю, что, когда мы создаем функции или классы в пространстве имен, необходимо в строке \ в начале, например:

namespace Foo;
function test() {}

Использованием:

\Foo\test();

Мне нужно использовать \ функции родного по какой-то причине? Или это будет излишним?

Author: Guilherme Nascimento, 2015-08-03

2 answers

Другой ответ и комментарий, мне помогли понять проблему:

Возможно, есть str_replace() в то пространство имен, что не является родной язык, и по этой причине, \ указанного чтобы сделать правильные ссылки. - @Havenard

Тем не менее я считаю, что необходимо, например, чтобы лучше понять причины этого.

, почему мы используем в конечном итоге \ перед собственной функции, как например \str_replace(...) это потому, что как правило, есть функция с тем же именем внутри (не родной) в пространстве имен, например:

src/Foo/utils.php:

<?php
namespace Foo;

function str_replace($a, $b, $str)
{
    //Isto chama a função nativa str_replace
    return strtolower(\str_replace($a, $b, $str));
}

function foo($a, $b, $c)
{
    //Isto chama Foo\str_replace
    return str_replace($a, $b, $c);
}

, Используя:

<?php
include 'src/Foo/utils.php';

Foo\foo('a', 'b', 'abcabcabc');

Необходимо Было "добавить" \ в этой строке return strtolower(\str_replace($a, $b, $str)); потому что, если бы не он, мы бы остаться рекурсивно/"бесконечно", вызвав Foo\str_replace, ибо мы в течение Foo. Если мы сделаем

В то время, что мы используем \str_replace вызываем функцию, которая находится за пределами namespace, который в данном случае является функцией, родной.

, Но если мы сделаем так:

<?php
namespace Foo;

function str_replace($a, $b, $str)
{
    //Isto chama Foo\str_replace novamente
    return strtolower(str_replace($a, $b, $str));
}

function foo($a, $b, $c)
{
    //Isto chama Foo\str_replace
    return str_replace($a, $b, $c);
}

Будет происходить следующее сообщение об ошибке:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 523800 bytes) in Z:\web\projeto\src\Foo\utils.php on line 6

Завершения

Должны использовать \ для собственных функций при объявить другую функцию с тем же именем в пространстве имен.

<?php
namespace Foo\Bar {
    function str_replace($a, $b, $c) {
         //...Algo aqui
    }

    //Aqui usamos Foo\Bar\str_replace, pois é relativo ao namespace
    echo str_replace('a', 'b', 'abc');

    //Aqui chamamos a função nativa
    echo \str_replace('a', 'b', 'abc');
}

Нет необходимости использовать шаблон \ есть функция с тем же именем функции родной

<?php
namespace Foo\Bar {
    //Aqui o PHP chama a função nativa pois não existe a função Foo\Bar\str_replace
    echo str_replace('a', 'b', 'abc');
}

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

Файл vendor/Foo/Bar/Baz.php:

<?php
namespace Foo\Bar {
    class Baz {
        public function output()
        {
           echo \test(); //Mostra 'Olá mundo!'
           echo test(); //Causa erro
        }
    }
}

index.php:

<?php
function test() {
    echo 'Olá mundo!';
}

include 'vendor/Foo/Bar/Baz.php';

Foo\Bar\Baz::output();
 9
Author: Guilherme Nascimento, 2020-12-21 01:25:37

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

Http://www.php.net/manual/en/language.namespaces.global.php

Http://www.php.net/manual/en/language.namespaces.rationale.php

 3
Author: Daniel Omine, 2015-08-03 21:31:17