【发布时间】:2011-03-10 09:06:02
【问题描述】:
据我所知,我们在 PHP 中使用命名空间的唯一原因是解决类(+ 函数和常量)与其他同名类冲突的问题。
问题在于大多数框架都设置了它们的 autoload 和 文件系统层次结构 来反映类的名称。而且再也没有人真正需要()或包含()文件了。
那么命名空间对这有什么帮助?要么根据类名加载类:
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”的定义位置和来源感到困惑。
【问题讨论】:
-
我和你在一起。我讨厌命名空间和(糟糕!)命名空间运算符。虚拟类命名空间也是如此。
-
我同意,命名空间对健康有害。它使它变得不必要的复杂,您无法立即看到接下来会发生什么。一堆空目录中的一两个文件是愚蠢的。我讨厌它!改用好的 ol' 前缀。
标签: php namespaces class