Всем привет! До появления PHP 5.3 разработчики вынуждены были подбирать для функций и классов уникальные имена, так при их объявлении они были доступны во всем приложении. Однако проблема еще состояла в том что все чаще в проектах использовался библиотечный код, что сильно увеличивало зависимости от имен классов и функций.
Давайте рассмотрим следующий пример:
У нас есть два файла:
//Файл index.php
require_once('child.php');
class main{
public $name = 'main';
function __construct(){
echo $this->name;
}
}
//Файл child.php
class main{
public $name = 'child';
function __construct(){
echo $this->name;
}
}
При запуске файла index.php у нас возникнет фатальная ошибка, так как в подключаемом файле child.php определен класс с тем же названием.
Теперь давайте рассмотрим тот же пример, но с использованием пространства имен.
Скопировать в буфер
//Файл index.php
namespace index;
require_once('child.php');
class main{
public $name = 'main';
function __construct(){
echo $this->name;
}
}
//Файл child.php
namespace child;
class main{
public $name = 'child';
function __construct(){
echo $this->name;
}
}
Как видите для того чтобы установить пространство имен мы в самом начале файлов указали ключевое слово namespace и дали название пространству времен. Теперь в каждом файле определен свой собственный класс main и нет никаких конфликтов.
Теперь давайте попробуем создать экземпляры классов main в каждом файле и обратится к index.php
namespace index;
require_once('child.php');
class main{
public $name = 'main';
function __construct(){
echo $this->name;
}
}
echo "<br/>";
$main = new main();
namespace child;
class main{
public $name = 'child';
function __construct(){
echo $this->name;
}
}
$main = new main();
Как видите сначала у нас создался экземпляр класса main в фалйле child.php, так как он подключается выше, а затем index.php. Но что если нам необходимо к примеру в файле index.php вызвать функцию которая определена в файле child.php
//index.php
namespace index;
require_once('child.php');
class main{
public $name = 'main';
function __construct(){
echo $this->name;
}
}
echo "<br/>";
$main = new main();
myFunction();
//child.php
namespace child;
class main{
public $name = 'child';
function __construct(){
echo $this->name;
}
}
$main = new main();
function myFunction(){
echo 'Функция';
}
В этом случае произойдет ошибка. Так как в пространстве имен index функция myFunction не определена. Для того чтобы обратится к функции myFunction в index.php
namespace child;
class main{
public $name = 'child';
function __construct(){
echo $this->name;
}
}
function myFunction(){
echo "<br/>";
echo 'Функция';
}
namespace index;
use child as myFun;
require_once('child.php');
class main{
public $name = 'main';
function __construct(){
echo $this->name;
}
}
echo "<br/>";
$main = new main();
myFun\myFunction();
Как видите мы успешно смогли вызвать функцию myFunction в контексте файла index.php что же мы сделали?
Во первых мы через ключевое слово use обратились к пространству времен child и через ключевое слово as присвоили псевдоним. Теперь используя псевдоним в нашем случае это myFun мы можем спокойно обращаться к пространству времен child и вызывать из него любые функции классы и методы , не создавая при этом никаких конфликтов имен.
Как видите для того чтобы вызвать функцию myFunction мы указали в начале псевдоним, затем через обратный слэш имя название функции. Мы также можем беспрепятственно обращаться к методам класса main в файле child.php
namespace child;
class main{
public $name = 'child';
function __construct(){
echo $this->name;
}
public function myMethod(){
echo "<br/>";
echo 'Метод класса main в файле child.php';
}
}
function myFunction(){
echo "<br/>";
echo 'Функция';
}
namespace index;
use child as myFun;
require_once('child.php');
class main{
public $name = 'main';
function __construct(){
echo $this->name;
}
}
echo "<br/>";
$main = new main();
myFun\myFunction();
myFun\main::myMethod();
Как видите мы указываем псевдоним и через обратный слэш название класса и его метод.
Все довольно просто. Вот в общем и все дорогие друзья, надеюсь вам было интересно и вы узнали что то новое, а так всем спасибо за внимание. Удачи!