Насколько я могу судить, единственная причина, по которой мы имеем пространство имен в PHP, заключается в том, чтобы исправить проблему классов (+ функций и констант), столкнувшихся с другими классами с одним и тем же именем.
Проблема в том, что большинство фреймворков настраивают свои иерархии autoload и файловой системы, чтобы отразить имена классов. И никто не требует больше() s или include() s файлов.
Итак, как это упрощает namespacing? Либо класс загружается на основе его имени:
new Zend_Db_Table_Rowset_Abstract;
или покинуть это пространство имен
new Zend\Db\Table\Rowset\Abstract;
В любом случае я застрял, имея возможность создать только один класс с этим именем.
/var/www/public/Zend/Db/Table/Rowset/Abstract.php
UPDATE Я не уверен, что у меня есть точка.
Даже если я создал два файла с тем же class Zend\Db\Table\Rowset\Abstract
в них, я все равно не мог использовать их вместе, так как они оба претендуют на одно и то же пространство имен. Мне нужно было бы изменить имена имен имен, которые мы уже делаем!
Это оставляет мне поверить, что единственное использование для пространств имен - это имена функций. Теперь мы можем, наконец, иметь три функции, которые все называются одинаковыми!
Или подождите, я забыл, что вы не можете этого сделать, поскольку каждый из них требует префикс пространства имен!
a\myfunction();
b\myfunction();
c\myfunction();
Взяв пример ircmaxell:
$model = new \Application\Model\User;
$controller = new \Application\Controller\User;
Как это иначе, чем без?
$model = new Application_Model_User;
$controller = new Application_Controller_User;
Это также аккуратная функция звучания - но что это действительно делает для нас?
use \Application\Model\User as UserModel;
use \Application\Controller\User as UserController;
$foo = new UserModel;
$bar = new UserController;
Теперь у вас не может быть класса с именем "UserModel", так как у вас есть параметр пространства имен для этого термина. У вас также не может быть двух классов, названных под одним и тем же псевдонимом.
Я думаю, хорошо, что вы можете переименовать длинный Zend_Db_Table_Rowset_Abstract
use Zend_Db_Table_Rowset_Abstract as RowAbstract;
что приводит к путанице разработчиков в отношении того, где неопределенный класс "RowAbstract" определен и поступает из системы.