- Подключить пространство имен php
- Подключить пространство имен php
- Определение пространства имен
- Обращение к пространству имен
- Вложенные пространства имен
- Псевдонимы
- Подключение множества классов
- Подключение констант и функций
- Команда use и пространства имен
- Подключение нескольких классов
- Команда use и относительные пути
- Namespaces
Подключить пространство имен php
- 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 .
- Relative path name like subdirectory/foo.txt . This resolves to currentdirectory/subdirectory/foo.txt .
- Absolute path name like /main/foo.txt . This resolves to /main/foo.txt .
- 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.
- 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 .
- 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 ;
?php
const FOO = 1 ;
function foo () <>
class foo
static function staticmethod () <>
>
?>
namespace Foo \ Bar ;
include ‘file1.php’ ;
?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
?>
Подключить пространство имен php
Пространства имен позволяют избежать конфликта имен и сгруппировать функционал. Внутри пространства имен могут быть размещены классы, интерфейсы, функции и константы.
Если какая-та конструкция (например, класс или функция) определена вне любого пространства имен, то считается, что она расположена в глобальном пространстве имен.
Определение пространства имен
Для создания пространства имен применяется директива namespace , после которой идет название пространства имен:
namespace base; class Person < private $name; function __construct($name) < $this->name = $name; > >
В данном случае определено пространство имен «base». Обычно названия пространств указываются в нижнем регистре. Все, что расположено ниже этой директивы, относится к пространству имен «base». То есть класс Person принадлежит пространству имен base.
Стоит учитывать, что определение пространства имен должно быть расположено выше любого другого кода или разметки html. Например:
name = $name; > > ?> name; ?>
Обращение к пространству имен
Для обращения к конструкциям из пространства имен перед названием конструкции через слеш указывается ее пространство имен. Например, у нас есть файл Person.php :
Теперь в другом файле подключим этот файл и обратимся к классу Person:
Здесь определено другое пространство имен — «work». Сначала в нем подключается файл «Person.php». Затем создаем объект класса Person.
Если конструкции одного пространства имен используются в другом пространстве имен (в том числе в глобальном пространстве имен), то перед названием конструкции указывается название ее пространства имен. Так, поскольку класс Person расположен в другом пространстве имен — «base», то перед названием класса указываем его полное имя с учетом его пространства имен:
Обратите внимание, что сначала идет слеш, потом название пространства имен и потом через слеш название класса ( \base\Person ).
Без указания пространства имен мы можем использовать конструкцию только в том же пространстве имен, в котором она определена.
Вложенные пространства имен
Одни пространства имен могут содержать другие. Например:
Здесь класс Person определен в пространстве имен base\classes\ . То есть теперь для обращения к классу Person в другом пространстве имен надо указывать \base\classes\Person :
Псевдонимы
Если в одном пространстве имен используется какой-то класс из другого пространства имен, то писать каждый раз полное имя класса с учетом его пространства имен может быть утомительно, кроме того, перегружает код. Например:
name . "
"; $bob = new \base\classes\Person("Bob"); echo $bob->name; ?>
В этом случае мы можем использовать псевдонимы, которые задаются в виде
use полное_имя_класса as псевдоним;
Конструкция use импортирует класс из другого пространства имен, а оператор as устанавливает для него псевдоним.
Так, сократим предыдущий код с помощью псевдонимов:
name . "
"; $bob = new User("Bob"); echo $bob->name; ?>
В данном случае для класса \base\classes\Person установлен псевдоним User , соответственно теперь для обращения к классу Person мы можем использовать его псевдоним User. Результат тот же, но кода меньше.
Можно использовать только конструкцию use без указания псевдонима. Тогда класс можно будет исользовать по его непосредственному имени:
name . "
"; $bob = new Person("Bob"); echo $bob->name; ?>
Подключение множества классов
Подобным образом можно подключать сразу несколько классов. Например, пусть в файле Person.php имеются следующие классы:
name = $name; > > class Employee extends Person < >?>
Подключение классов Person и Employee:
name . "
"; $sam = new Employee("Sam"); echo $sam->name; ?>
Определение псевдонимов можно сократить:
Подключение констант и функций
Для подключения констант применяется инструкция use const , а для подключения функций — use function .
Например, определение файла Person.php :
name . "
"; > class Person < public $name; function __construct($name) < $this->name = $name; > > ?>
Подключим класс Person вместе с константой adminName и функцией printPerson:
Команда use и пространства имен
Пусть также есть класс Page , создающий внутри себя объекты класса Data :
Как вы видите, оба наших класса находятся в совсем разных пространствах имен, поэтому вызовы класса Data упростить нельзя, подобно тому, как мы это делали в предыдущем уроке. Эти вызовы, однако, очень длинные и неудобные, так как в каждом вызове класса Data приходится указывать его длинное пространство имен.
Для решения подобной проблемы существует специальная команда use . С помощью этой команды достаточно один раз подключить класс по его полному имени, и после этого можно будет обращаться к этому классу просто по имени класса. Смотрите пример:
Упростите следующий код с использованием use :
Упростите код наследования класса, применив команду use .
Подключение нескольких классов
Если нужно подключить несколько классов, то каждый из них подключается своей командой use :
Упростите следующий код с использованием use :
Команда use и относительные пути
При использовании команды use можно указывать относительные пути, подобно тому, как мы это делали в предыдущем уроке. Давайте посмотрим на примере. Пусть мы подключаем некоторый класс:
Как вы видите, начало пространства имен подключаемого класса совпадает с текущим пространством. Это значит, что мы можем эту часть при подключении нашего класса, убрав при этом начальный обратный слеш:
Упростите следующий код с использованием use :
Namespaces
The keyword ‘use’ has two different applications, but the reserved word table links to here.
It can apply to namespace constucts:
file1:
class Cat <
static function says () > ?>
file2:
class Dog static function says () > ?>
file3:
class Animal static function breathes () > ?>
file4:
include ‘file1.php’ ;
include ‘file2.php’ ;
include ‘file3.php’ ;
use foo as feline ;
use bar as canine ;
use animate ;
echo \ feline \ Cat :: says (), «
\n» ;
echo \ canine \ Dog :: says (), «
\n» ;
echo \ animate \ Animal :: breathes (), «
\n» ; ?>
Note that
felineCat::says()
should be
\feline\Cat::says()
(and similar for the others)
but this comment form deletes the backslash (why. )
The ‘use’ keyword also applies to closure constructs:
$callback =
function ( $pricePerItem ) use ( $tax , & $total )
$total += $pricePerItem * ( $tax + 1.0 );
>;
array_walk ( $products_costs , $callback );
return round ( $total , 2 );
>
?>
Tested on PHP 7.0.5, Windows
The line «use animate;» equals the line «use animate as animate;»
but the «use other\animate;» equals «use other\animate as animate;»
file1:
class Cat <
static function says () > ?>
file2:
class Dog static function says () > ?>
file3:
class Animal static function breathes () > ?>
file4:
include ‘file1.php’ ;
include ‘file2.php’ ;
include ‘file3.php’ ;
use foo as feline ;
use bar as canine ;
use other \ animate ; //use other\animate as animate;
echo feline \ Cat :: says (), «
\n» ;
echo canine \ Dog :: says (), «
\n» ;
echo \ animate \ Animal :: breathes (), «
\n» ; ?>
In addition to using namespaces and closures, the use keyword has another new meaning as of PHP 5.4 — using traits:
trait Hello public function sayHello () echo ‘Hello ‘ ;
>
>
trait World public function sayWorld () echo ‘World’ ;
>
>
class MyHelloWorld use Hello , World ;
public function sayExclamationMark () echo ‘!’ ;
>
>