Php namespace use extends

Php namespace use extends

Для этих правил здесь приведены несколько важных определений: Определения имени пространства имён Неполное имя

Это идентификатор без разделителя пространств имён, например, Foo

Это идентификатор с разделителем пространств имён, например, Foo\Bar

Это идентификатор с разделителем пространств имён, который начинается с разделителя пространств имён, например, \Foo\Bar . Пространство имён \Foo также является абсолютным именем.

Это идентификатор, начинающийся с namespace , такой как namespace\Foo\Bar .

  1. Абсолютные имена всегда разрешаются без ведущего разделителя пространства имён. Например, \A\B разрешается в A\B .
  2. Относительные имена всегда разрешаются в имена с заменой namespace на текущее пространство имён. Если имя встречается в глобальном пространстве имён, префикс namespace\ просто удаляется. К примеру namespace\A внутри пространства имён X\Y разрешается в X\Y\A . То же самое имя в глобальном пространстве имён разрешается в A .
  3. Для полных имён первый сегмент преобразуется в соответствии с текущей таблицей импорта класса или пространства имён. Например, пространство имён A\B\C импортировано как C , тогда имя C\D\E преобразуется в A\B\C\D\E .
  4. Для полных имён, если не применяется никакого правила импорта, текущее пространство имён добавляется к имени. Например, имя C\D\E внутри пространства имён A\B , преобразуется в A\B\C\D\E .
  5. Для неполных имён имена преобразуются текущей таблице импорта в зависимости от типа элемента. Это означает, что имена классов преобразуются согласно таблице импорта классов, имена функций — согласно таблице импорта функций и константы согласно таблице импорта констант. К примеру, после use A\B\C; , использование new C() разрешается как A\B\C() . Аналогично, после use function A\B\fn; , использование fn() разрешается как A\B\fn .
  6. Неполные имена, если отсутствуют ограничения в таблице импорта и если они используются как класс, то они разрешаются с префиксом текущего пространства имён. Например, new C() внутри пространства имён A\B разрешаются как A\B\C .
  7. Неполные имена, если отсутствуют ограничения в таблице импорта и если они используются как функция или константа, а код находится не в глобальном пространстве имён, имена разрешаются во время исполнения. Например код, в пространстве имён A\B , вызывающий функцию foo() , разрешается так:
    1. Производится поиск функции из текущего пространства имён: A\B\foo() .
    2. PHP пытается найти и вызвать функцию глобального пространства foo() .

    Пример #1 Примеры разрешения имён

    namespace A ;
    use B \ D , C \ E as F ;

    foo (); // сперва пытается вызвать «foo», определённую в пространстве имён «A»,
    // затем вызывает глобальную функцию «foo»

    \ foo (); // вызывает функцию «foo», определённую в глобальном пространстве

    my \ foo (); // вызывает функцию «foo», определённую в пространстве «A\my»

    F (); // сперва пытается вызвать «F», определённую в пространстве имён «A»,
    // затем вызывает глобальную функцию «F»

    new B (); // создаёт объект класса «B», определённого в пространстве имён «A».
    // если не найден, то пытается сделать автозагрузку класса «A\B»

    new D (); // используя правила импорта, создаёт объект класса «D», определённого в пространстве имён «B»
    // если не найден, то пытается сделать автозагрузку класса «B\D»

    new F (); // используя правила импорта, создаёт объект класса «E», определённого в пространстве имён «C»
    // если не найден, то пытается сделать автозагрузку класса «C\E»

    new \ B (); // создаёт объект класса «B», определённого в глобальном пространстве,
    // если не найден, то пытается сделать автозагрузку класса «B»

    new \ D (); // создаёт объект класса «D», определённого в глобальном пространстве,
    // если не найден, то пытается сделать автозагрузку класса «D»

    new \ F (); // создаёт объект класса «F», определённого в глобальном пространстве,
    // если не найден, то пытается сделать автозагрузку класса «F»

    // статические методы/функции пространства имён из другого пространства имён

    B \ foo (); // вызывает функцию «foo» из пространства имён «A\B»

    B :: foo (); // вызывает метод «foo» из класса «B», определённого в пространстве имён «A»
    // если класс «A\B» не найден, то пытается сделать автозагрузку класса «A\B»

    D :: foo (); // используя правила импорта, вызывает метод «foo» класса «D», определённого в пространстве имён «B»
    // если класс «B\D» не найден, то пытается сделать автозагрузку класса «B\D»

    \ B \ foo (); // вызывает функцию «foo» из пространства имён «B»

    \ B :: foo (); // вызывает метод «foo» класса «B» из глобального пространства
    // если класс «B» не найден, то пытается сделать автозагрузку класса «B»

    // статические методы/функции пространства имён из текущего пространства имён

    A \ B :: foo (); // вызывает метод «foo» класса «B» из пространства имён «A\A»
    // если класс «A\A\B» не найден, то пытается сделать автозагрузку класса «A\A\B»

    \ A \ B :: foo (); // вызывает метод «foo» класса «B» из пространства имён «A»
    // если класс «A\B» не найден, то пытается сделать автозагрузку класса «A\B»
    ?>

    Источник

    Команда use и пространства имен

    Пусть также есть класс Page , создающий внутри себя объекты класса Data :

    Как вы видите, оба наших класса находятся в совсем разных пространствах имен, поэтому вызовы класса Data упростить нельзя, подобно тому, как мы это делали в предыдущем уроке. Эти вызовы, однако, очень длинные и неудобные, так как в каждом вызове класса Data приходится указывать его длинное пространство имен.

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

    Упростите следующий код с использованием use :

    Упростите код наследования класса, применив команду use .

    Подключение нескольких классов

    Если нужно подключить несколько классов, то каждый из них подключается своей командой use :

    Упростите следующий код с использованием use :

    Команда use и относительные пути

    При использовании команды use можно указывать относительные пути, подобно тому, как мы это делали в предыдущем уроке. Давайте посмотрим на примере. Пусть мы подключаем некоторый класс:

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

    Упростите следующий код с использованием use :

    Источник

    Php namespace use extends

    1. Relative file name like foo.txt . This resolves to currentdirectory/foo.txt where currentdirectory is the directory currently occupied. So if the current directory is /home/foo , the name resolves to /home/foo/foo.txt .
    2. Relative path name like subdirectory/foo.txt . This resolves to currentdirectory/subdirectory/foo.txt .
    3. Absolute path name like /main/foo.txt . This resolves to /main/foo.txt .
    1. Unqualified name, or an unprefixed class name like $a = new foo(); or foo::staticmethod(); . If the current namespace is currentnamespace , this resolves to currentnamespace\foo . If the code is global, non-namespaced code, this resolves to foo . One caveat: unqualified names for functions and constants will resolve to global functions and constants if the namespaced function or constant is not defined. See Using namespaces: fallback to global function/constant for details.
    2. Qualified name, or a prefixed class name like $a = new subnamespace\foo(); or subnamespace\foo::staticmethod(); . If the current namespace is currentnamespace , this resolves to currentnamespace\subnamespace\foo . If the code is global, non-namespaced code, this resolves to subnamespace\foo .
    3. Fully qualified name, or a prefixed name with global prefix operator like $a = new \currentnamespace\foo(); or \currentnamespace\foo::staticmethod(); . This always resolves to the literal name specified in the code, currentnamespace\foo .

    Here is an example of the three kinds of syntax in actual code:

    namespace Foo \ Bar \ subnamespace ;

    const FOO = 1 ;
    function foo () <>
    class foo
    static function staticmethod () <>
    >
    ?>

    namespace Foo \ Bar ;
    include ‘file1.php’ ;

    const FOO = 2 ;
    function foo () <>
    class foo
    static function staticmethod () <>
    >

    /* Unqualified name */
    foo (); // resolves to function Foo\Bar\foo
    foo :: staticmethod (); // resolves to class Foo\Bar\foo, method staticmethod
    echo FOO ; // resolves to constant Foo\Bar\FOO

    /* Qualified name */
    subnamespace \ foo (); // resolves to function Foo\Bar\subnamespace\foo
    subnamespace \ foo :: staticmethod (); // resolves to class Foo\Bar\subnamespace\foo,
    // method staticmethod
    echo subnamespace \ FOO ; // resolves to constant Foo\Bar\subnamespace\FOO

    /* Fully qualified name */
    \ Foo \ Bar \ foo (); // resolves to function Foo\Bar\foo
    \ Foo \ Bar \ foo :: staticmethod (); // resolves to class Foo\Bar\foo, method staticmethod
    echo \ Foo \ Bar \ FOO ; // resolves to constant Foo\Bar\FOO
    ?>

    Note that to access any global class, function or constant, a fully qualified name can be used, such as \strlen() or \Exception or \INI_ALL .

    Example #1 Accessing global classes, functions and constants from within a namespace

    function strlen () <>
    const INI_ALL = 3 ;
    class Exception <>

    $a = \ strlen ( ‘hi’ ); // calls global function strlen
    $b = \ INI_ALL ; // accesses global constant INI_ALL
    $c = new \ Exception ( ‘error’ ); // instantiates global class Exception
    ?>

    Источник

    Читайте также:  Java format decimal separator
Оцените статью