Блог веб разработки

Блог веб-разработки статьи | видеообзоры | исходный код

Пространство имен php

Всем привет! До появления 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();

Как видите мы указываем псевдоним и через обратный слэш название класса и его метод.

Все довольно просто. Вот в общем и все дорогие друзья, надеюсь вам было интересно и вы узнали что то новое, а так всем спасибо за внимание. Удачи!

Оцените статью

Еще статьи

Агрегатные функции в SQL

Область видимости php

canvas html

Метки GIT

CSS counter-increment

CSS supports

zipfile python

spellcheck html

FileSystem api

Комментарии

Проверочный код

В данном разделе пока нет комментариев!

История

    ПОДПИСКА

    • Подпишись и получай информацию о выходе новых статей на почту! Просто введите свою почту, нажмите кнопку подписаться. На почту должно будет прийти сообщение с потверждением подписки. Если сообщение не пришло проверьте раздел спам или попробуйте другую почту. Также по всем техническим проблемам вы можете написать в поддержку

    НОВОСТИ

    • Всем привет! Запустил новый сервис для поиска и бесплатного скачивания, прослушивания аудиокниг. Здесь вы можете найти множество литературы и прослушать ее. Вскоре возобновлю написание статей.