Проблема в том, что Function.prototype.bind()
принимает один или несколько аргументов
(thisArg[, arg1[, arg2[, ...]]])
Когда вы используете Function.prototype.apply()
с аргументами (fn, [fn, 4, 4])
, вы делать две вещи ...
Function.prototype.bind
this
с fn
и 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
}
Пространства имен являются механизмом языка программирования для организации переменных, функций и классов. 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
?>
Для получения дополнительной информации:
Пространство имен позволяет Вам организовывать код и дает Вам способ инкапсулировать Ваши объекты.
Можно визуализировать пространства имен, поскольку файловая система использует каталоги для связанных с группой файлов.
В основном пространства имен предоставляют Вам путь в который к связанным с группой классам, функциям и константам.
Они также помогают избежать коллизий имени между Вашими классами/функциями/константами PHP и улучшить удобочитаемость кода, избегая дополнительно-долгих имен классов.
Объявление пространства имен в качестве примера:
<?php
namespace MyProject;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
?>
Пространства имен решают проблему именования коллизий при импорте классов и функций из библиотек.
Без пространств имен при включении двух библиотек, которые, оказывается, определяют функцию/класс с тем же именем (т.е., две библиотеки, что оба включают класс, названный 'пользователем'), он перестанет работать.
Без поддержки пространства имен в PHP большинство библиотек взяло к добавлению префикса их функции/имен классов с чем-то, что, вероятно, будет уникально в попытке избежать коллизий имени. Проблема, это создает более длинные имена функций или имена классов.
Пример, данный здесь, имеет класс исключений:
PEAR_Form_Loader_Validate_Table_Element_Validator_Exception.
Можно импортировать из длинного пространства имен в собственный локальный объем как псевдоним с помощью ключевого слова 'AS' - имя, которое Вы выбираете. Таким образом у Вас может все еще быть короткое имя класса по Вашему выбору в Вашем локальном объеме.
Следующее применяет 'псевдоним' под названием DbConnection к Пехлеви:: DB:: Соединение.
use Zend::DB::Connection as DbConnection
Пространства имен часто используются с библиотеками, способность сослаться на код библиотеки с 1 единым пространством имен помогает не ударить других, которые уже используются.