【问题标题】:PHP Static Class or NamespacePHP 静态类或命名空间
【发布时间】:2012-08-10 08:14:03
【问题描述】:

我想了解人们对使用静态类而不是命名空间的看法。我来自 C++ 背景,非常喜欢它的语法以及它如何让您构建代码。我最近决定需要将我的代码分组为逻辑单元,而不仅仅是文件。例如,我更喜欢像 User::login 这样的调用而不是 user_login。所以,我做了一些谷歌搜索,发现 PHP 有命名空间,我松了一口气。不过我的解脱并没有持续多久,我真的不喜欢这种语法。它给我的函数调用增加了更多的混乱。所以,目前我正在使用静态类来模拟命名空间。这有什么缺点吗?

我在PHP Namespaces vs Classes with static functions 发现了一个类似的问题,但没有太多讨论。

另外,有没有办法避免以下情况:

class Test {
 public static void myFunc() {
  Test::myOtherFunc();
 }
 public static void myOtherFunc() {

 }
}

我认为可以在不指定名称的情况下调用同一类中的函数,但显然不是。是否有任何解决方法(例如在 C++ 中有 using 关键字)。

【问题讨论】:

  • self::$this-> 在 PHP 中分别用于调用自己的静态和实例方法。
  • 所以没有办法隐含限定条件?即检查当前类的功能?
  • 不,但我发现明确是一件好事 :)
  • 嘿,我喜欢它在类之间是显式的,但我习惯它在一个类中是隐式的。哦,好吧,我想我最终会习惯的。
  • 你应该试着超越审美的不和谐。这将比仅仅因为您更喜欢双冒号而模仿命名空间更有益。

标签: php namespaces static-class


【解决方案1】:

巧合的是,我实际上一直在朝着完全相反的方向前进:

  1. 使用命名空间来组织域类(或函数)
  2. 使用依赖注入,否则我会使用静态类

用静态类来模拟命名空间的问题是你不能跨多个文件组织它们,所有东西都必须在一个文件中定义;这很可能取决于个人喜好。

关于静态类的另一件事是,你开始时没有任何状态,慢慢地一些状态管理开始蔓延,最终你会得到一些奇怪的锁定依赖。状态应该为实例保留。目前我唯一值得注意的静态类是站点范围的配置。

最后,静态类中的自引用是显式的,而在命名空间中它的工作方式与 C++ 完全一样:您指定函数名称,然后首先在命名空间中查找它。

【讨论】:

  • 我喜欢命名空间的想法以及它们如何让您管理代码,正如您所说,您可以跨多个文件组织它们。我唯一真正的抱怨是笨拙的语法。我认为没有必要使用 \ 并删除与其他语言的一致性。
  • @user1520427 我知道你的感受,它不是一个很好的外观,但把它当作一个目录结构的东西,它是有道理的 :) 默认的自动加载器实际上也是这样使用它的。
【解决方案2】:

如果从代码结构的角度来看,静态类方法和命名空间函数没有区别。它们最终都在全球范围内。唯一不同的是,使用静态类方法,您是在尝试伪造 OOP。

因此,如果您真正需要的是独立/实用函数,则最好使用命名空间函数。命名空间用于对事物(函数和类)进行分组。

至于你User::login() 的例子,这将是一个不好的做法。相反,您应该拥有一个能够包含状态的真实对象。

$mapper = new UserMapper;
$user = new User;
$user->setNickname( $name );

$mapper->fetch( $user );

if ( $user->hasPassword( $password ) )
{
    $user->setLastLogin( time() );
}
else
{
    // log the access attempt
    // set error state
}

$mapper->save( $user );

底线是:如果您使用的是静态结构(函数或方法),则它不是 OOP。你只是在假装它。相反,您应该使用真正的 OOP,使用 dependency injection

如果你的代码到处使用静态方法和变量,它会导致类之间的紧密耦合,添加global state 并使harder to maintain and test 成为你的代码库。这不是 PHP 特有的。

【讨论】:

    猜你喜欢
    • 2011-12-09
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 2023-04-09
    • 2014-11-13
    • 2012-12-05
    • 2013-03-10
    • 2012-05-27
    相关资源
    最近更新 更多