Простору імен в PHP

2

Від автора: Розробляючи складне веб-додаток, може виникнути ситуація, коли при оголошенні функції або змінної відбувається дублювання імен, що негайно призведе до помилки. Тому в даному уроці ми з Вами розглянемо дуже корисне нововведення в PHP 5.3 – простору імен, використовуючи яку, можна забути про помилки, пов’язані з дублюванням назв елементів Вашого скрипта.

Простору імен в PHPПростору імен в PHP

Поняття простору імен

Для початку розглянемо наступні два файли. Файл file1.php

Файл file2.php

При цьому зверніть увагу, що в кожному з них оголошена функція foo(). Відразу хотів би зазначити, що зараз ми ще не говоримо про просторах імен та жодним чином їх не оголошуємо. А значить, за замовчуванням використовується глобальний простір імен. Тепер зверніть увагу на ще один файл в якому ми підключимо два попередніх файлу і викличемо на виконання функцію foo(). Файл index.php

Запустивши даний файл у браузері, ми, звичайно ж, побачимо помилку, так як в даний момент у нас оголошується дві функції, з однаковими іменами:

Простору імен в PHP

Так само хотів би зазначити, що звертаючись до функції foo(), в даному випадку ми використовуємо неквалификационное ім’я – тобто це лише ідентифікатор конкретної функції (ім’я функції, без урахування простору імен). Що б запобігти появі помилки – використовуємо простору імен. Для цього в кожному з підключаються файлів вкажемо власний простір імен, використовуючи ключове слово namespace. Файл file1.php

Файл file2.php

Зверніть увагу, що оголошуючи простір імен, обов’язково необхідно прописувати ключове слово namespace перед будь-яким кодом PHP або відображенням даних на екран, інакше буде помилка. Тепер, якщо ми оновимо дані в браузері – ми отримаємо помилку виду:

Простору імен в PHP

Швидше за все Ви здогадалися, помилка означає, що не знайдена функція foo(). Дана функція визначена, але в інших просторах імен. Файл index.php використовує глобальний простір імен, тому звертаючись до функції foo(), використовуючи неквалификационное ім’я, ми ні як не можемо отримати доступ до функцій foo(), оголошеною в інших просторах імен. Для того, що б отримати доступ до функції foo(), файлу file1.php ми повинні на початку імені функції вказати простір імен:

File1\foo();

При цьому в браузері ми побачимо відпрацювання викликається функції:

Простору імен в PHP

Таким чином, ми вказали інтерпретатору мови PHP, де шукати потрібну функцію нас (в якому просторі імен, здійснювати пошук). І в нашому випадку відпрацювала функція foo() з файлу file1.php. Але, кожен раз при виклику функцій, або змінних, звертатися до просторів імен не зовсім зручно, тому у файлі index.php ми можемо оголосити простір імен, яке нас цікавить і відповідно викликати функцію foo(), використовуючи неквалификационное ім’я:

При цьому, якщо ми перейдемо браузер, то побачимо, що функція відпрацьовує нормально. Тепер давайте подивимося, що буде, якщо я в поточному просторі імен, звернуся до функції foo(), наступним чином:

File1\foo();

У цьому випадку ми побачимо помилку наступного виду:

Простору імен в PHP

Помилка виникає тому, як ми з Вами звертаємось до функції, використовуючи ім’я і простір імен — File1\foo(), таким чином, ми використовуємо кваліфікаційне ім’я. Кваліфікаційне ім’я елемента містить простір імен, а також ідентифікатор елемента (його ім’я). В цьому випадку, так і у випадку з неквалификационными іменами, інтерпретатор PHP завжди буде додавати оголошене простір імен до імені викликається елемента. Таким чином, якщо ми на початку файлу оголосили простір імен File1, і викликаємо на виконання функцію File1\foo() – інтерпретуватися дана рядок буде як File1\File1\foo(). А тепер давайте подивимося, що буде, якщо я звернуся до функції foo(), наступним чином:

\File1\foo();

У цьому випадку ми побачимо, що функція відмінно відпрацьовує.

Тут, хотів би зазначити, що \File1\foo() – це повне кваліфікаційне ім’я функції foo(). Повне кваліфікаційне ім’я завжди починається із зворотного слеша і містить повне простір імен і ідентифікатор цікавить елемента (ім’я функції, зміною і т. д). Якщо ми звертаємося до повного кваліфікаційним імені, то інтерпретатор не буде враховувати оголошене раніше простір імен при інтерпретації.

Оголошуючи простору імен, ми можемо створювати якісь ієрархії просторів імен, приміром. Файл file1.php

Файл file2.php

При цьому у файлі index.php ми можемо викликати функцію foo(), наступним чином:

Імпортування просторів імен і псевдоніми

Якщо в нашому проекті передбачена ієрархія просторів імен, ми можемо імпортувати цікавить нас простір імен в той або інший файл, наприклад, у файлі index.php імпортуємо простір імен, використовуючи ключове слово use:

При цьому ми не оголошуємо простір імен, а тільки імпортуємо його і для виклику функцій або змінних, необхідно звертатись до їх просторів імен. Але тепер достатньо звернутися тільки до дочірнього простору імен і інтерпретатор PHP, виконає пошук потрібного елемента в імпортованих просторах імен.

Імпортуючи простір імен, можна вказати псевдонім, використовуючи який можна посилатися на простір імен, наприклад:

В цьому випадку ми можемо звертатися до цікавлять нас елементам, використовуючи псевдонім. При интепретации цей псевдонім буде замінений на імпортоване простір імен, тобто, викликаючи name\foo(), ми викликаємо MyProject\File1\foo(). Дуже зручно використовувати імпортування просторів імен у зв’язці з псевдонімами, працюючи з класами, наприклад, є файл такого змісту:

Даний файл належить до простору імен MyProject\File3 і відповідно розташований за адресою MyProject\File3\My2.php, тобто ієрархія просторів імен, точно відповідає структурі папок, у яких міститься файл. У файлі index.php ми підключимо даний файл і імпортуємо його простір імен, використовуючи при цьому псевдонім:

Зверніть увагу я імпортують простір імен і псевдонім призначаю безпосередньо для класу, описаного у зазначеному просторі імен, таким чином при створенні об’єкта даного класу, я можу використовувати псевдонім: new myclass(). Що власне ми і бачимо при оновленні сторінки браузера:

Простору імен в PHP

Ще хотів би звернути Вашу увагу, на наступний приклад, файл index.php:

«;
$class = str_replace(«\\»,»/»,$class);
include $class.’.php’;
}
var_dump(new myclass());

В даному прикладі, ми з Вами розглянемо створення механізму автоматичного завантаження класів, використовуючи простору імен. Зверніть увагу, спочатку імпортуємо простір імен і призначаємо псевдонім для імені класу. Далі описуємо функцію __autoload($class), функцію автоматичного завантаження класів, яка виконається при створенні раніше невизначеного об’єкта класу. Дана функція приймає параметром змінну $class, в яку потрапить ім’я класу, об’єкт якого ми намагаємося створити. В нашому випадку використовується псевдонім myclass, який при інтерпретації буде замінений на MyProject\File3\My2, а це повністю відповідає файловій структурі прикладу, залишається тільки замінити зворотні скісні риски на прямі і додати розширення для файлу.

При оновленні браузера, на екрані ми побачимо наступне:

Простору імен в PHP

Як Ви бачите все успішно відпрацьовує.

Як Ви бачите простору імен, можуть бути дуже корисними, особливо для великих і складних проектів, які розробляються командою розробників. Використовуючи простору імен, можна запобігти виникненню помилок пов’язаних з дублюванням назв різних елементів розроблюваного скрипта, так як кожен розробляється елемент, який розробляється окремим людиною, буде визначено у власному просторі імен.

На цьому даний урок завершено. Всього Вам доброго і вдалого кодування!!!