Что такое пространство имен и как оно реализовано в PHP?

Проблема в том, что Function.prototype.bind() принимает один или несколько аргументов

(thisArg[, arg1[, arg2[, ...]]])

Когда вы используете Function.prototype.apply() с аргументами (fn, [fn, 4, 4]), вы делать две вещи ...

  1. Связывание контекста Function.prototype.bind this с fn и
  2. Вызов bind(fn, 4, 4)

Теперь вы видите проблему? bind(fn, 4, 4) создаст новую функцию, связанную с fn для ее контекста this и с аргументами по умолчанию (4, 4).


Если вы действительно хотите, чтобы fn появлялся как первый аргумент сам по себе (что для меня звучит как плохая идея), я считаю, что оператор спреда гораздо проще понять

function func(fn, ...args) {
  return fn.bind(fn, fn, ...args)
  //             ^   ^   ^
  //             |   |   |
  //             |   |   args #2, #3, ...
  //             |   arg #1
  //             this
}

6
задан alex 27 February 2009 в 06:34
поделиться

4 ответа

Пространства имен являются механизмом языка программирования для организации переменных, функций и классов. 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
?>

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

24
ответ дан 8 December 2019 в 03:02
поделиться

Пространство имен позволяет Вам организовывать код и дает Вам способ инкапсулировать Ваши объекты.

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

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

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

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

<?php
namespace MyProject;

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

?>
3
ответ дан 8 December 2019 в 03:02
поделиться

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

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

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

Пример, данный здесь, имеет класс исключений:

PEAR_Form_Loader_Validate_Table_Element_Validator_Exception.

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

Следующее применяет 'псевдоним' под названием DbConnection к Пехлеви:: DB:: Соединение.

use Zend::DB::Connection as DbConnection
3
ответ дан 8 December 2019 в 03:02
поделиться

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

1
ответ дан 8 December 2019 в 03:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: