Namespace в php

Однією з цікавих новинок PHP 5.3.0 є простору імен (namespace). Ті, хто працює з Java і C # вже здогадалися, про що йде мова. У цих мовах така можливість була присутня з самого початку. І ось тепер, php-програмісти можуть теж використовувати щось подібне в своїх проектах. В рамках цієї статті я розповім тобі про призначення просторів імен і користь, яку вони можуть принести. Постараюся не вантажити твій мозок сухою теорією і викласти все максимально цікаво. Отже, let's go!

Для чого ж потрібні ці простору імен?

На секунду уяви, що ти є розробником мега крутий бібліотеки. Ти з шаленим завзяттям намагаєшся написати класний продукт і при першій нагоді дописувати нові функції. Поступово твій код збільшується і рано чи пізно настає день, коли орієнтуватися в ньому стає вкрай проблематично. Ні, я розумію, що ти дотримуєшся хорошого тону в написанні коду, але коли в тебе вже оголошено десятки методів і різних класів, то заплутатися в цьому господарстві простіше простого. Годі про сумне. Просто уяви, що ти вирішив розширити якийсь клас (або створити новий), створивши для нього додатковий метод. Начебто все просто. Знайшов клас, описав метод. Але де гарантії, що використовується ім'я методу або самого класу не використовувалося раніше? Так, можна банально перевірити, скориставшись пошуком або Class Explore (якщо ти працюєш в IDE). Це не дуже довго.

Namespace в php

Ну а що якщо тобі мимоволі потрібно створити клас з ім'ям, яке вже було використано? Звичайно, є варіант не паритися і обізвати метод / клас по-іншому. Рішення хороше, коли пишеш весь код самостійно. На жаль, цей спосіб не можна назвати хорошим, коли потрібно прищепити в свій додаток "чужий код". Адже в чужих рукописах теж можуть бути визначені методи / класи / функції з такими ж іменами, як і у тебе. Що робити? Ламати голову і придумувати їм все нові імена, а потім ручками перейменовувати? Вигадувати хитромудрі префікси і давати дуже довгі імена (наприклад, як це зроблено в Zend)? Раніше-то довелося б, але тепер, цю проблему елегантно вирішать простору імен. З їх допомогою, по-справжньому зручно структурувати код. Через кілька хвилин ти в цьому переконаєшся.

Підіб'ємо невеликий підсумок і запам'ятаємо раз і назавжди, що простору імен (namespace) - це якесь сховище, призначене для логічної угруповання унікальних імен. Ти можеш оголосити кілька просторів імен і описати в них класи з однаковими іменами / методами, але різним функціоналом. При ініціалізації таких об'єктів, ти повинен будеш вказати простір імен, що містить опис потрібного тобі об'єкта. Простір імен можна порівнювати з папками в файлової системі. Всім відомо, що в одній папки не може файлів з однаковими іменами. Але ми знову ж, знаємо, що інсталяційний файл більшості програм - це setup.exe. Якщо спробувати помістити файли різних програм в одну і ту ж папку, то ми побачимо підступну птицю обломінго. Система нам відразу видасть попередження про те, що такий файл в цій директорії існує і для виконання завдання, вона (система) може замінити наявний файл, на копіюється. Погодившись на це сумнівну пропозицію, ти геть затрешь наявну програму. Вихід з такої ситуації - створити окрему папку і помістити інсталяційний файл другої програми в неї. При необхідності установки першої або другої програми, ти будеш керуватися ім'ям папки, тобто запускати інсталяційний файл потрібний тобі програми.

Сподіваюся, з цього прикладу ти вловив суть і пізнав силу просторів імен, а якщо ні, то не впадай у відчай, після розгляду поданих нижче прикладів, все встане на свої місця.

Простори назв на практиці

Насамперед, відразу хочу розвіяти сумніви, що при використанні PHP 5.3.0 тобі доведеться влазити в свій старий код і примусово застосовувати простору імен. Все залежить тільки від твого бажання. Якщо ти не використовуєш неймспейси, то твій код просто-напросто розташовується в глобальному просторі. Звернення до всіх класами / методам / функцій буде відбуватися так само, як і було раніше.

Погляньмо на найпростіший приклад:

Цілком можливо, що у тебе виникне необхідність оголосити кілька просторів імен в одному файлі сценарію. Це абсолютно нормальне бажання і php може повністю його задовольнити. Поглянь на наступний приклад:

Дочірні простору імен

PHP 5.3.0 також підтримує і дочірні простору імен. Для визначення дочірнього неймспейса ти повинен використовувати символ зворотного слеша. наприклад:

Викликаємо код з простору імен

Основи і теорію по роботі з просторами імен я тобі розповів і тепер саме час спробувати все це справа на реальній практиці. Створи новий файл сценарію і перепиши в нього нижче представлений код:

У цьому коді я оголосив два основних неймспейса (myProject, myProject2) і одне дочірні - myProject2 \ sub. У першому просторі імен, оголошена всього одна функція, яка відповідає за виведення традиційного "Hello World". У другому я оголосив константу і клас. Щоб продемонструвати виклик класу, я описав в ньому один метод - helloWorld (). Не важко здогадатися, що після його виклику, він як і однойменна функція виведе фразу, знайому кожному програмісту. Дочірнє «простір імен», по суті, не відрізняється від MyProject. За винятком того, що воно є дочірнім по відношенню до myProject2.

Збережи всю цю писанину в файл під яким-небудь ім'ям (я вибрав sample_of_namespace.php) і створюй ще один файл сценарію. У ньому-то ми і напишемо код, який демонструє виклик функцій / класу наших неймспейсов. Отже, повне вміст сценарію, що відповідає за виклик коду з простору імен наведено нижче:

Підводячи підсумки, хочу сказати. Грамотне використання просторів імен, дозволить дуже добре структурувати код і спростити подальший рефакторинг. Можна вважати, що розробники PHP потрудилися на славу і реалізували дійсно корисну можливість. Шкода, тільки чекати її довелося довго. Але як говориться: "Краще пізно, ніж ніколи". Якщо, тебе зацікавила тема простору імен, то Новомосковський в цьому ж номері другу частину статті, присвячену використанню цієї корисної можливості. На цьому все. Бай!