Насколько я могу судить, единственная причина, по которой у нас есть пространство имен в PHP, состоит в том, чтобы решить проблему столкновения классов (+ функций и констант) с другими классами с таким же именем.
Проблема заключается в том, чтобольшинство фреймворков настраивают свою автозагрузку и иерархию файловой системы , чтобы отразить имена классов.И никто на самом деле больше не требует файлов () или include ().
Так как же это помогает пространству имен? Либо класс загружается на основе его имени:
new Zend_Db_Table_Rowset_Abstract;
или отключить его пространство имен
new Zend\Db\Table\Rowset\Abstract;
В любом случае я не могу создать только один класс с этим именем.
/var/www/public/Zend/Db/Table/Rowset/Abstract.php
ОБНОВЛЕНИЕ Я не уверен, что понял суть.
Даже если бы я создал два файла с одинаковым 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".