2011-04-27 169 views
2

我面临着以下问题:PHP命名空间的组织,命名

  • 我有一个命名空间Exception\*, 其中包含了几种类型的 例外。

  • 我有一个命名空间Exception\User\*,其中包含了 特定类型的异常 (ForbiddenLoggedOut ...)。

我在哪里把User基本异常类,通过ForbiddenLoggedOut扩展:

  • Exception\User,即在Exception\*命名空间(更好的全名)?
  • Exception\User\User,即在Exception\User\*命名空间(更一致)?
  • Exception\User\Exception,即我将其重命名为Exception\User\*命名空间(奇怪)的“基本”异常?

注意:User异常类不是抽象的。

精度:我使用了一个有例外的例子,这只是一个例子。我真的很想知道如何在名称空间树中放置/如何命名基类。

谢谢,如果你能帮助我!

回答

1
Exception\User 
Exception\User\Forbidden 
Exception\User\LoggedOut 
3

你如何设计你的代码真的取决于你。然而,有些人已经考虑过这个问题,并且定义了PSR-0 standard。在所有你的概念似乎不是很有用。如果在命名空间\My\Space(我认为)中出现问题,每个人都会期望这个命名空间发生异常。如果在原因和异常本身之间存在逻辑链接,则更容易设计相应的try-catch条款。

try { 
    $x = new \My\Space\Class; 
    $x->doSomething(); 
} catch (\My\Space\SomethingWentWrongException $e) { 
    // something went wrong 
} catch (\My\Space\Exception $e) { 
    // something unexpected from this namespace went wrong 
} 

更新(反映问题的精度):

我认为,有(可以说)2.5的方式;)你可以把基类的命名空间,它通常是使用/实施/扩展,例如*\Filter\FilterInterface*\Filter\ConcreteFilter。另一种解决方案是将其升级一层(*\Filter),并在接口/基类后面命名子命名空间,或者将其命名为其他东西(即半解决方案)。我更喜欢最后一个,例如界面*\Filter和具体类*\filters\SomeFilter(是的,我的命名空间是小写的;))。

重点是,你坚持你的决定。不要混淆多个“风格”。

+0

“异常”的事情只是一个例子,我不知道在哪里放置我的异常,但将基类放在名称空间树中。我会更正问题,以便更清楚。 – 2011-04-27 22:02:42

+0

刚刚更新了我的答案。 – KingCrunch 2011-04-27 22:15:47