Что такое пространство имен — namespaces — в PHP?
Доброго времени суток, уважаемые читатели нашего блога! В прошлой статье мы начали тему, связанную с объектно-ориентированным программированием в PHP. Сегодня мы копнем поглубже и рассмотрим пространство имен — namespaces — в языке PHP, используя простые примеры программирования. И первая хорошая новость – Namespaces прост в изучении. Начнем!
Создадим класс в PHP
<?php
class Foo
{
public function doAwesomeFooThings ()
{
// здесь должен быть ваш код
}
}
?>
Мы заполняем PHP 5.2 класс, который делает много важных вещей. Например, скажем «Привет» читателям:
<?php
class Foo
{
public function doAwesomeFooThings ()
{
echo “Привет, читатели!”;
}
}
?>
Как использовать класс Foo? Использование Foo простое, напишем:
<?php require ‘foo.php’; $foo = new Foo(); ?>
Для того, чтобы идти в ногу со временем, давайте используем новое понятие, которое появилось в PHP 5.3 — пространство имен Namespace. Пространство имен (namespace) используется подобно вложенным папкам, добавим это пространство, расположенное в Acme\Tools.
<?php
// это файл foo.php
namespace Acme\Tools;
class Foo
{
public function doAwesomeFooThings ()
{
echo “Привет, читатели”;
}
}
?>
Для использования Foo нужно назвать его по-новому. Это будет ссылка на файл, представляющая собой полный путь.
<?php require ‘foo.php’; $foo = new \Acme\Tools\Foo(); ?>
Вот и все. Добавляя пространство имен в класс – это словно организация файлов из одной директории в несколько поддиректорий. Для ссылки на класс используйте его имя, начинающееся со слеша «\». Большое имя воспринимается тяжело, поэтому давайте добавим короткое. Для этого дадим классу \Acme\Tools\Foo() псевдоним.
<?php require ‘foo.php’; use \Acme\Tools\Foo as SomeFooClass; $foo = new SomeFooClass(); ?>
Можно как-нибудь назвать класс, либо использовать имя по умолчанию Foo.
<?php require ‘foo.php’; use \Acme\Tools\Foo; $foo = new Foo(); ?>
Хорошо. Как насчет старых классов PHP без имени пространства? Для этого перейдем к подходящему для нашего случая классу datetime. И возьмем несколько новых фишек от PHP 5.3. Создание нового объекта даты datetime выглядит аналогично:
<?php require ‘foo.php’; use \Acme\Tools\Foo; $foo = new Foo(); $dt = new DateTime(); ?>
Для обычного файла это все еще работает. А вот в файле с объявлением пространства namespace PHP считает, что речь идет о файле в директории \Acme\Tools:
<?php
namespace Acme\Tools;
class Foo
{
public function doAwesomeFooThings ()
{
echo “Hi listeners”;
// здесь поиск будет вестись в директории \Acme\Tools
$dt = new DateTime();
}
}
?>
Или вы можете сослаться на класс в глобальном пространстве, используя полное имя \Datetime:
<?php
namespace Acme\Tools;
class Foo
{
public function doAwesomeFooThings ()
{
echo “Hi listeners”;
// здесь поиск будет вестись в глобальном пространстве
$dt = new \DateTime();
}
}
?>
Предыдущий фрагмент кода показывает, что мы обращаемся к глобальному классу DateTime
Чтобы обратиться глобальному классу DateTime можно это сделать с помощью use:
<?php
namespace Acme\Tools;
use \DateTime;
class Foo
{
public function doAwesomeFooThings ()
{
echo “Hi listeners”;
// здесь поиск будет вестись в глобальном пространстве
$dt = new DateTime();
}
}
?>
Использование use выглядит глупо, но оно говорит PHP, что когда вы вызываете DateTime, вы имеете в виду класс без имени, указывающий на время. Если убрать слэш перед DateTime, то все будет работать точно так же.
<?php
namespace Acme\Tools;
use DateTime;
class Foo
{
public function doAwesomeFooThings ()
{
echo “Hi listeners”;
// здесь поиск будет вестись в глобальном пространстве
$dt = new DateTime();
}
}
?>
И вы даже не заметите этого. ОК. Пока!
P.S.
SoftMaker.kz
SoftMaker.kz
SoftMaker.kz
SoftMaker.kz