Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我有一个包含14个静态方法和4个静态属性的类-这很糟糕吗?_Php_Oop_Object_God Object - Fatal编程技术网

Php 我有一个包含14个静态方法和4个静态属性的类-这很糟糕吗?

Php 我有一个包含14个静态方法和4个静态属性的类-这很糟糕吗?,php,oop,object,god-object,Php,Oop,Object,God Object,我一直在编写一个PHP类,其长度正好为450行,包含14个静态方法、4个静态属性以及6个常量(以及私有的\uu构造()和\uu克隆()) 我想知道我做错了什么,我的班级是邪恶的吗 使用该类时,始终会调用单个方法,如: MyClass::coolMethod(); 然后你把它放在一边,让它觉得让它可以构造是愚蠢的 用它构造对象真的没有多大意义,因为它更像是一个包含一些方法的工具,您可以直接调用这些方法 实际上,在这14个方法中,有7个是公共的,其余的是私有的,供类使用。这取决于类的用途。如果方法

我一直在编写一个PHP类,其长度正好为450行,包含14个静态方法、4个静态属性以及6个常量(以及私有的
\uu构造()
\uu克隆()

我想知道我做错了什么,我的班级是邪恶的吗

使用该类时,始终会调用单个方法,如:

MyClass::coolMethod();
然后你把它放在一边,让它觉得让它可以构造是愚蠢的

用它构造对象真的没有多大意义,因为它更像是一个包含一些方法的工具,您可以直接调用这些方法


实际上,在这14个方法中,有7个是公共的,其余的是私有的,供类使用。

这取决于类的用途。如果方法在数据方面大部分是不一致的,那么这是分组函数(现在是方法)的一个完全有效的解决方案。如果您需要在函数之间共享值,这是一个非常糟糕的主意,因为这不仅仅是一个简单的函数列表,而是分组在一个公共名称下。名称空间是另一种选择,但如果您使用的是低于5.3的PHP版本,这可能是最好的解决方案。

这就像说,“我有一栋有四间卧室的房子,这不好吗?”

静态方法既不好也不坏。有十四种方法既不好也不坏。从广义上讲,拥有十四种静态方法既不好也不坏

如果在您的14个方法中,您要花很大的精力来模拟对象实例,或者模拟继承,那么有些地方出了可怕的错误。PHP将允许您创建实例,并支持继承,因此尝试以任何其他方式模拟它们都是愚蠢的


但是,如果您使用的类本质上就像一个名称空间,其中函数和数据一起工作,但没有单独的类实例可供处理,那么这绝对没有什么错。

您应该避免
静态
全局

静力学给了你和全局力学一样的缺点。无论何时使用任何类方法,都是将对该类的依赖项硬编码到消费代码中。结果是可维护性较差的紧密耦合代码。通过严格使用依赖项注入,可以很容易地避免这种情况

不能注入和传递静态类,例如()。只是很痛


另外,请记住,类只能做一件事。浏览一下你的课堂,看看里面是否有更好的东西放在其他地方,以避免写一篇不错的文章。但是,对于所有这些静态的道具,你可能会考虑把它做成单体。< /P> 下面是我正在构建的框架中使用的一些单例代码。您可以将其拆开,使其成为类中唯一返回自身的一个版本的公共方法

class ClassName {
    function getInstance()
        {
            static $instance;

            if (!isset($instance)) 
      {
                $instance = new ClassName();
            }

            return $instance;
        }
}
然后,您可以通过执行ClassName::GetInstance()->othermethod()来使用它


然后,该类可以拥有大量的私有值,否则就可以获得对象的所有好处。

我想说,不,这还不错。事实上,这是唯一的方式来伪造某些行为之前。例如,这是一种伪造名称空间的方法。人们可以将函数封装在静态类中,而不是让它们“自由地”运行。因此,很多php开发人员都很熟悉这一点,并且不会让大多数人感到困惑。不过,现在您应该尝试使用PHP的“新”名称空间特性,如果需要以对象格式存储数据,可以将其与单例模式结合起来。您也可以在名称空间中包含一个“全局”变量,它有时可以正常工作。但是看看名称空间,看看它是否适合您,然后看看单例模式是否符合您的特定需求。

所以您将该类用作名称空间。这对我来说似乎完全正确。你做得对。至少在您切换到PHP5.3或更高版本之前。IMO是这样的。使用类作为分组容器。同意-这也有助于避免许多php框架/应用程序经常使用的经典“include(crapload_of_functions.php)”。只有使用自动加载,它才有助于避免这种情况。通过将它们分组在类中,您可以使代码更干净,而不是更快。我认为单例是一个非常糟糕的主意(它们是反模式最流行的示例之一)。如果他真的需要私人价值观,那么他需要一个真正的阶级。据我所知,他只是想将一些函数分组,比如在名称空间中。我不确定单例是否是反模式的。它们绝对可能被滥用,但所有模式都是如此。是什么让你称他们为反模式我应该提到的是,在这个框架中,单例是核心应用程序,它不仅需要在一个地方跟踪大量数据,还需要提供大量公共资源(如模型)。任何其他方法都需要传递对该控件对象的引用。我们都知道php和引用的循环程度。@DampeS8N:singleton引入了全局状态,这很糟糕。此外,它们使测试变得一团糟。服务定位器模式将是一种很好的替代方法,可以替代疯狂地传递引用。单例是反模式,尤其是在PHP中,在PHP中,一切都只是为了请求而存在。我们没有像Java那样在内存中共享实例的应用服务器,全局状态只有在不可跟踪的情况下才是糟糕的。根据定义,全球国家就是我们在这里讨论的东西。而且,除此之外。。。我可能记错了,但服务定位器不是单身汉的一个例子吗?