Что такое пространство имен и как оно реализовано в PHP? - PullRequest
6 голосов
/ 27 февраля 2009

Я слышал, что в последней версии PHP есть поддержка пространств имен. Я знаю, что переменные, определенные в глобальной области видимости, имеют пространство имен no , так как же создать переменную в другом пространстве имен?

Это просто способ классификации переменных / функций?

Ответы [ 4 ]

24 голосов
/ 27 февраля 2009

Пространства имен - это механизм языка программирования для организации переменных, функций и классов. В PHP 5.3 добавлена ​​поддержка пространств имен, которые я продемонстрирую в следующем примере:

Скажем, вы хотите объединить два проекта, которые используют одно и то же имя класса Пользователь , но имеют разные реализации каждого:

// Code for Project One (proj1.php)
<?php
  class User {
    protected $userId;
    public function getUserId() {
      return $this->userId;
    }
  }
  $user = new User;
  echo $user->getUserId();
?>

// Code for Project Two (proj2.php)
<?php
  class User {
    public $user_id;
  }
  $user = new User;
  echo $user->user_id;
?>

<?php
  // Combine the two projects
  require 'proj1.php';
  require 'proj2.php'; // Naming collision!
  $myUser = new User; // Which class to use?
?>

Для версий PHP менее 5.3 вам придется столкнуться с проблемой изменения имени класса для всех экземпляров класса Пользователь , который используется одним из проектов для предотвращения конфликта имен:

<?php
  class ProjectOne_User {
    // ...
  }
  $user = new ProjectOne_User; // Code in Project One has to be changed too
?>

Для версий PHP, больших или равных 5.3, вы можете использовать пространства имен при создании проекта, добавив объявление пространства имен:

<?php
  // Code for Project One (proj1.php)
  namespace ProjectOne;
  class User {
    // ...
  }
  $user = new User;
?>

<?php
  // Combine the two projects
  require 'proj1.php';

  use ProjectOne as One; // Declare namespace to use

  require 'proj2.php' // No collision!

  $user = new \One\User; // State which version of User class to use (using fully qualified namespace)

  echo $user->user_id; // Use ProjectOne implementation
?>

Для получения дополнительной информации:

3 голосов
/ 27 февраля 2009

A пространство имен позволяет упорядочить код и дает возможность инкапсулировать ваши элементы.

Вы можете визуализировать пространства имен, поскольку файловая система использует каталоги для группировки связанных файлов.

В основном пространства имен обеспечивают способ группировки связанных классов, функций и констант.

Они также помогают избежать конфликтов имен между вашими классами / функциями / константами PHP и улучшают читабельность кода, избегая слишком длинных имен классов.

Пример объявления пространства имен:

<?php
namespace MyProject;

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }

?>
3 голосов
/ 27 февраля 2009

Пространства имен решают проблему именования коллизий при импорте классов и функций из библиотек.

Без пространств имен, если вы включите две библиотеки, в которых определена функция / класс с одинаковым именем (т. Е. Две библиотеки, каждая из которых включает в себя класс с именем «пользователь»), произойдет сбой.

Без поддержки пространства имен в PHP большинство библиотек взяли префикс своих функций / классов перед чем-то, что, вероятно, будет уникальным, чтобы избежать коллизий имен. Проблема в том, что это создает более длинные имена функций или классов.

Пример здесь относится к классу исключений:

PEAR_Form_Loader_Validate_Table_Element_Validator_Exception.

Вы можете импортировать из длинного пространства имен в свою локальную область видимости в качестве псевдонима, используя ключевое слово «AS» - выбранное вами имя. Таким образом, у вас все еще может быть короткое имя класса по вашему выбору в вашей локальной области.

Следующее применяет псевдоним DbConnection к Zend :: DB :: Connection.

use Zend::DB::Connection as DbConnection
1 голос
/ 27 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...