войти зарегистрироваться

PHPКак использовать пространства имён в PHP, Часть 3: Ключевые слова и автозагрузка

image
В части 1 и 2 нашей серии статей мы рассмотрели основы пространства имён, а также импортирование, псевдонимы и правила разбора имён. В данной, заключительной, статье мы обговорим некоторые более продвинутые опции пространства имён.

PHPКак использовать пространства имён в PHP, Часть 2: импортирование, псевдонимы и правила разбора имён

image
В части 1, мы обсуждали для чего нужны пространства имён (namespaces) в PHP, и что обозначает зарезервированное слово namespace. В этой статье мы исследуем оператор use и способ, которым PHP разрешает имена пространств имён.

PHPКак использовать пространства имен в PHP, Часть 1: Основы

image

Предисловие: На Хабре уже публиковались несколько статей, посвященных пространству имен в PHP (все ссылки на них я привожу в приложении). Однако, этот интересный и полезный вопрос был раскрыт не полностью. Поэтому я привожу перевод первой из трех статей по данной теме (остальные переведу в ближайшее время). P.S. Статья для начинающих

Пространства имен (namespaces) — это одно из самых значительных изменений в PHP 5.3. Они будут хорошо знакомы С# и Java разработчикам, и, вероятно, они изменят к лучшему структуру PHP-приложений.

PHPРазделитель в пространствах имен в PHP

Рекомендую ознакомиться с php internals: endnamespacediscussion

После очередной дискуссии в IRC принято решение использовать символ \ в качестве разделителя в пространствах имен в PHP. Патч готовится, и неизвестно войдет ли он в PHP 5.3 или нет.

С аргументацией можно ознакомиться здесь или здесь

Основная проблема при использовании :: в качестве разделителя по мнению разработчиков заключается в том, что понять что происходит в строке кода
Foo::bar();

станет трудно (это вызов статического метода bar() из класса Foo или вызов функции bar() из пространства имен Foo?). Дополнительным ограничением также является сам интепретатор PHP, который не сможет отличить разрешение имени от вызова статического метода. Избавиться от такой неоднозначности предполагается при помощи символа \.

PHP О пользе namespace'ов

В последних версиях PHP появились namespace'ы — пространства имен.

У них есть очевидные преимущества:
— помогают сократить названия классов;
— позволяют избежать конфликтов имен;
— помогают лучше структурировать классы.

Но, помимо этого, есть еще преимущество, на которое не так часто обращают внимание: namespace'ы помогают разработчику видеть зависимости того или иного класс, причем это не приводит к какому-либо оверхеду. Поясню.

Помните, как в PHP4 мы писали перед объявлением класса:
require_once «MyClassParent.php»;
require_once «MyClassDependency.php»;


Потом пришел PHP5, появился __autoload() и spl_autoload_register() — мы убрали безусловные подключения файлов и вместе с ними оверхед. Все хорошо, да вот только теперь не так очевидно стало, какие же другие классы/файлы нужны для нашего класса, чтобы он нормально функционировал.

И тут — появляется батут php-5.3. Теперь, без лишнего оверхеда мы можем, и даже не только можем, но и в определенных случаях должны — указывать зависимости нашего класса:
use myns:: MyClassParent;
use anotherns:: MyClassDependency;


Отметим, что при использовании use не происходит подключения файлов с классами.
Теперь, как говорится, и программисты волки сыты, и харды овцы целы.

PHPПространство имён в php 5.3 и php 6

Пространство имён (namespace/package) знакомо java и c# программистам, теперь доступно и в php. Нужно оно для того, что-бы не писать длинные перефиксы к названиям классов, как сейчас делается в Zend, PEAR и других библиотеках и платформах для совместимости.
Вместо этого классы, функции, интерфейсы (абстрактные классы) и константы могут быть объединены в одно пространство имён. Глобальные переменные в это пространство не входят.

Простой пример


Определяется пространство ключевым словом namespace
//определяем класс в пространстве
namespace MyCMS::Core;
class System{}

Использование этого класса в третьих библиотеках осуществляется ключевым словом use
require_once('mycms/core.php');
use MyCMS::Core::System; //импортируем только заданный класс
$objSystem=new System;

Web-разработкаПространство имён в Javascript-коде 2

Прочитав заметку об использовании пространств имён в Javascript коде мне захотелось поделиться подходом, который использую я. Он изобретён не мной, конечно, но, возможно кто-то о нём не знает. Этот подход отличается от предложенных в той статье тем, что позволяет кроме функций и данных видимых снаружи, также определять данные и функции локальные для пространства имен и невидимые снаружи.

Web-разработкаИспользование пространств имен для организации JavaScript-кода

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

OS InfernoАрхитектура OS Inferno — 2.

Один из краеугольных камней архитектуры Inferno — юниксовая идея с
файлами-устройствами доведена до предела: в Inferno файлами представлено
абсолютно всё. Например, в Inferno нет понятия «сокет».