我一直在编写一个长度恰好为450行的PHP类,它包含14个静态方法和4个静态属性以及6个常量(以及私有__construct()
和__clone()
)。
我想知道我做错了什么,是我的阶级邪恶吗?
当您使用该类时,您总是调用一个方法,如:
MyClass::coolMethod();
然后你完全不管它,所以觉得让它可以构建是愚蠢的吗?
从它构造对象真的没什么意义,因为它更像是一个包含一些你可以直接调用的方法的工具。
实际上,在这14种方法中,其中7种是公开的 - 其余的是私人供课堂使用。
答案 0 :(得分:4)
您应该static
避免global
。
Statics给出了全局给你的相同缺点。无论何时使用任何类方法,您都会将对该类的依赖性硬编码到使用代码中。结果是紧密耦合的代码可维护性较差。 avoiding statics altogether和纪律使用依赖注入可以很容易地避免这种情况。
您不能注入和传递静态类,例如when you have to unit-test them, you cannot mock them(or at least only with some effort)。这简直太痛苦了。 Static methods are death to testability.
另外,请记住,课程应该只做一件事。 They should have a single responsibility。通过你的课程看看那里的东西是否更好地放在其他地方以避免写God Class.
答案 1 :(得分:3)
这取决于这门课的目的。如果这些方法在数据方面大部分是不连贯的,那么这是分组函数(现在的方法)的完全有效的解决方案。如果您需要在函数之间共享值,这是一个非常糟糕的主意,因为这不仅仅是一个简单的函数列表,以一个通用名称分组。命名空间是另一种选择,但如果你使用的PHP版本低于5.3,这可能是最好的解决方案。
答案 2 :(得分:2)
这就像是在说,“我有一间有四间卧室的房子。那真糟糕吗?”
静态方法既不好也不坏。有十四种方法既不好也不坏。有十四种静态方法,无论是好还是坏。
如果在你的十四种方法中,你将竭尽全力模拟对象实例,或模拟继承,那么就会出现严重错误。 PHP将允许您创建实例,并支持继承,因此尝试以任何其他方式模拟它们将是愚蠢的。
但是如果你只是把你的类基本上用作命名空间,那么函数和数据都可以一起工作但是没有单独的类实例可以应对,那绝对没有错。
答案 3 :(得分:1)
不错。但是,对于所有这些静态道具,您可能需要考虑将其设为单例。
这是我正在构建的框架中使用的一些单例代码。你可以拆开它,使它成为你的班级唯一的公共方法,返回自己的一个版本。
class ClassName {
function getInstance()
{
static $instance;
if (!isset($instance))
{
$instance = new ClassName();
}
return $instance;
}
}
然后,您可以通过执行ClassName :: GetInstance() - > othermethod();
然后,这个类可以拥有大量的私有值,并获得对象的所有好处。
答案 4 :(得分:0)
我会说不,不错。事实上,这是以前伪造某些行为的唯一方法。例如,这是伪造命名空间的一种方法。可以将函数封装在静态类中,而不是让它们“免费”。所以很多php开发人员都熟悉这一点,实际上并不会让大多数人感到困惑。你现在应该尝试做的是利用PHP的“新”命名空间功能,如果你真的需要以对象格式存储数据,如果需要将它与单例模式结合起来。您也可以在命名空间中包含一个“全局”变量,并且有时可以正常工作。但是看看命名空间,看看它是否适合你,然后看看单例模式是否符合你的特定需求。