2016-08-01 113 views
2

不时我一直看到一倍命名空间是这样的:
Namespace/Namespace/Subnamespace/PHP命名空间约定 - 加倍的命名空间

例如新的Prestashop(1.7)采用了这种约定
namespace PrestaShop\PrestaShop\Core;

有人能解释我的好处这种类型的命名空间?

而且一些教程说的命名空间是这样的:

namespace mynamespace/classname 
classs classname {} 

这样有什么好处呢?因为我只会看到缺点:更复杂的命名空间和更多的输入。

也看到了这个问答&答:PHP Namespace Questions
我可以看到唯一的缺点:更容易出现错误,因为它取决于相对命名空间

PS:我一直在使用始终是绝对的命名空间。我的感觉不太容易出现错误,如果我错了,请给我启发。

+0

他们正在关注[psr-4](http://www.php-fig.org/psr/psr-4/)。命名空间本身没有任何问题,但是我可以看到它是如何混淆的。 – Andrew

+0

@Andrew我正在写一个符合PSR-4的答案,但似乎没有任何需要这个子名称空间的东西。这仅仅是创造者的选择吗?它是否来自PSR-0? – nerdlyist

+0

@nerdlyist我认为这是创作者的选择,这是我能做的唯一事情,假设。 – Andrew

回答

2

如前所述,这是用于自动加载并遵循PSR-4惯例。命名空间的命名约定通常由创建者决定。唯一需要的部分是顶级命名空间,但如果需要可以使用许多子命名空间。

例如,在PrestaShop的composer.json他们有:

"autoload": { 
    "psr-4": { 
     "PrestaShop\\PrestaShop\\": "src/", 
     "PrestaShopBundle\\": "src/PrestaShopBundle/" 
    } 
} 

所以命名空间PrestaShop\PrestaShop\可以让你对任何事物中src

slim框架(路由器),他们有:

"autoload": { 
    "psr-4": { 
     "Slim\\": "Slim" 
    } 
} 

所以在这一个你只需要使用命名空间Slim\Class

在我的第一个项目之一,我不喜欢的东西:

"autoload": { 
    "psr-4": { 
     "App\\Models\\": "app_name/models", 
     "App\\Validators\\": "app_name/validators" 
     //And so on 
    } 
} 

我不认为这会伤害任何东西,但到底是多余的。