Требуется косая черта "\" в начале собственной функции, когда мы используем пространства имен?
я Заметил, что некоторые библиотеки часто используют в роли родного 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();
Мне нужно использовать \
функции родного по какой-то причине? Или это будет излишним?
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();
" Не является обязательным, но необходимо, чтобы избежать конфликтов имен, или когда необходимо получить доступ непосредственно имена в глобальной области видимости.
Http://www.php.net/manual/en/language.namespaces.global.php
Http://www.php.net/manual/en/language.namespaces.rationale.php