PHP静态类或命名空间

PHP静态类或命名空间,php,namespaces,static-class,Php,Namespaces,Static Class,我想了解人们对使用静态类而不是名称空间的看法。我来自C++背景,我很喜欢它的语法,以及它如何让你构造代码。我最近决定,我需要将代码分组到逻辑单元中,而不仅仅是文件。例如,我更喜欢像User::login这样的调用,而不是User\u login。所以,我在谷歌上搜索了一下,发现PHP有名称空间,我松了一口气。我的解脱没有持续多久,我真的不喜欢语法;它给我的函数调用增加了更多的混乱。所以,目前我正在使用静态类来模拟名称空间。这有什么坏处吗 我在会议上发现了一个类似的问题,但没有太多的讨论 此外,是

我想了解人们对使用静态类而不是名称空间的看法。我来自C++背景,我很喜欢它的语法,以及它如何让你构造代码。我最近决定,我需要将代码分组到逻辑单元中,而不仅仅是文件。例如,我更喜欢像User::login这样的调用,而不是User\u login。所以,我在谷歌上搜索了一下,发现PHP有名称空间,我松了一口气。我的解脱没有持续多久,我真的不喜欢语法;它给我的函数调用增加了更多的混乱。所以,目前我正在使用静态类来模拟名称空间。这有什么坏处吗

我在会议上发现了一个类似的问题,但没有太多的讨论

此外,是否有办法避免以下情况:

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

 }
}

我假设在同一个类中调用函数而不指定名称是可以的,但显然不是。是否有任何解决办法(例如在C++中使用关键字)。p> 巧合的是,我实际上正朝着完全相反的方向移动:

  • 使用名称空间组织域类(或函数)
  • 使用依赖注入,否则我会使用静态类
  • 使用静态类来模拟名称空间的问题是,您不能跨多个文件组织它们,所有内容都必须在一个文件中定义;这完全取决于个人品味

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


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

    如果从代码结构的角度看,静态类方法和命名空间函数之间没有区别。它们最终都是全球性的。唯一的区别是,使用静态类方法,您试图伪造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。你只是假装而已。相反,您应该使用真正的面向对象编程,使用


    如果您的代码到处使用静态方法和变量,则会导致类之间的紧密耦合,添加并生成代码库。这不是PHP特有的。

    self::
    $this->
    在PHP中分别用于调用您自己的静态方法和实例方法。因此,没有办法将限定隐式化?ie检查当前类的函数?不,但我发现显式是一件好事:)嘿,我喜欢在类之间显式,但我习惯于在类内隐式。哦,好吧,我想我最终会习惯的。你应该试着超越审美上的分歧。这将比仅仅因为喜欢双冒号而模仿名称空间更有益。我喜欢名称空间的想法以及它们如何让您管理代码,正如您所说,您可以跨多个文件组织它们。我唯一真正抱怨的是笨拙的语法。我不认为有必要使用\并删除与其他语言的一致性。@user1520427我知道您的感受,它不是一个很好的外观,但可以将其视为目录结构,这很有意义:)默认的自动加载程序实际上也是这样使用的。