Импорт классов и пространств имен в PHP: какая разница ведущей обратной черты?

StackOverflow https://stackoverflow.com/questions/4849279

Вопрос

В чем разница между этими двумя:

use Exception;
use \Exception;

Или те:

use Foo\Bar;
use \Foo\Bar;

А руководство говорит:

Обратите внимание, что для имен имен (полностью квалифицированные имена пространства имен, содержащие сепаратор пространства имен, такие как Foo Bar, в отличие от глобальных имен, которые не являются, такими как Foobar), ведущая обратная черта не является необходимой и не разрешена, поскольку импортные имена должны быть полностью квалифицированными,, ведущие, имена импорт должны быть полностью квалифицированы, ведущие обратные склады не нужны, так как импортные имена должны быть полностью квалифицированными, ведущие, имена импорт должны быть полностью квалифицированы, ведущая обратная черта не нужна, так как импортные имена и не обрабатываются относительно текущего пространства имен.

Но я не совсем понимаю это, так как все вышеперечисленные варианты работают, то есть, это определенно не «не разрешено».

Взгляд zend_do_use показало, что is_global (Установить, когда есть ведущая обратная черта) используется только для предупреждения в следующем случае:

namespace {
    use Exception;
}

Что говорит мне: «Заявление об использовании с не совместным именем« Исключение »не имеет никакого эффекта». (Хотя и делая то же самое с use \Exception будет иметь столько же эффекта, но не бросает предупреждение.)

Итак: я что -то упускаю? Есть ли какая -то разница?

Это было полезно?

Решение

Руководство определяет обратную черту как ненужный, что, естественно, означает, что если вы все еще используете его, то значение эквивалентно. Однако, как вы указали, в руководстве говорится, что оно предположительно не разрешено, что является ложным.

Тем не менее, есть что -то еще, беспокоящее с руководством. Они рекламируют это:

// importing a global class
use \ArrayObject;

Если это правда, что импортные имена не обрабатываются по сравнению с текущим пространством имен, то тогда use \ArrayObject а также use ArrayObject должен иметь такое же значение. Что еще могло use ArrayObject Обратитесь к другому глобальному? На практике двигатель будет импортировать глобальный.

Кроме того, с такими ошибками:http://bugs.php.net/bug.php?id=49143

Я считаю, что существует путаница из -за того, каким должен быть стандарт.

Чтобы ответить на ваш вопрос: нет никакой разницы. Однако, если бы я был разработчиком двигателя, который также был сторонником стандарта без лидерства use \Exception;. Анкет Я полагаю, что это было так.

Другие советы

На самом деле нет никакой разницы в использовании ведущей BackSlash в импорте пространства имен на данный момент, а также информацию в PHP Руководство изменился:

Обратите внимание, что для имен имен (полностью квалифицированные имена пространства имен, содержащие сепаратор пространства имен, такие как Foo Bar, в отличие от глобальных имен, таких как Foobar), ведущая обратная черта не нужна и и не нужна. не рекомендуется, поскольку импортные имена должны быть полностью квалифицированы и не обрабатываются относительно текущего пространства имен.

Так что теперь существует правдивая информация, что использование ведущей обратной связи не рекомендуется, но нет никакой информации о том, что ее не допускается в прошлом.

Итак, на данный момент:

use Exception;
use \Exception;

Эти 2 строки работают одинаково, но вы должны использовать первый.

Обычно определяет ведущая обратная черта, что идентификатор абсолютный. Если его отсутствует, предполагает интерпретатор, что это относительный идентификатор.

Это абсолютный идентификатор:

$x = new \Name\Space\To\Class();

Это относительный идентификатор, из -за не ведущей черты. Это относительно текущего пространства имен:

namespace Name\Space;
$x = new To\Class;

Это также относительный идентификатор. В этом случае он решен против use утверждение, потому что последняя часть (псевдоним) такая же, как и первая в классе:

namespace Other\Name\Space;
use Name\Space;
$x = new Space\To\Class;

Однако, потому что в namespace а также use Заявления только абсолютные идентификаторы (полностью квалифицированные имена) разрешены, можно опустить здесь. В namespace, даже не разрешено устанавливать ведущую обратную черту.

Для получения дополнительной информации о том, как PHP разрешает различные объявления пространства имен, см. Руководство по правилам пространства имен.

не скажу, что у нас есть

namespace MyNamespace
use Exception;
use \Exception;

Затем первое использование фактически импортирует класс MyNamespace Exception, а второй - только основной класс Исключение

так что у вас может быть что -то вроде

namespace MyNamespace;
class Exception extends \Exception{ }

И тогда я могу

throw new \Exception('Exception from global namespace');
throw new \MyNamespace\Exception('Exception from MyNamespace');

Ведущая обратная черта означает глобальное пространство имен. Если вы находитесь в сфере пространства имен, вы должны использовать это для достижения глобального пространства имен. Например:

namespace A
{
    class A
    {
        public function __construct()
        {
            echo('namespace: A<br />');
        }
    }
}

namespace B\A
{
    class A
    {
        public function __construct()
        {
            echo('namespace: B\\A<br />');
        }
    }
}

namespace B
{
    class B
    {
        public function __construct()
        {
            new \A\A(); // namespace: A
            new A\A(); // namespace: B\A
        }
    }
    new B();
}

С ведущей обратной чертой вы получили абсолютный путь, и без него вы получили относительный путь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top