1

我正在开发一个使用辅助类的 Web 应用程序。这些类包含各种操作的功能,例如表单处理。

有时我在我的应用程序中不止一个地方需要这些类,我现在这样做的方式是创建一个新对象。我不能传递变量,这将是太多的工作。

我想知道为此使用单例类。这样,我确信一次只有一个实例在运行。

然而,我的问题是,当我使用这种模式时,我是否应该为所有对象创建一个单例类,这会导致大量代码复制。

我是否可以创建一个 superHelper 的超类,它是一个单例类,然后让每个助手扩展它。

这种设置会起作用吗,还是有另一种选择?

如果它有效,是否有人对如何编写这样的 superHelper 类有任何建议。

感谢你们

4

4 回答 4

0

查看工厂模式和依赖注入。

http://www.potstuck.com/2009/01/08/php-dependency-injection/

于 2010-03-08T17:15:24.107 回答
0

您不能扩展单例类。请记住,在单例类中,我们将构造函数设为私有,因此如果构造函数是私有的,那么您如何扩展此类?我们都知道我们创建了一个类的对象,我们称之为构造函数,而在子类构造函数中,它隐式地称为父构造函数。所以在这种情况下,不能在子类中调用私有构造函数。

于 2013-04-29T12:02:07.513 回答
0

我不能传递变量,这将是太多的工作。

你确定吗?人们倾向于高估传递依赖关系的努力。如果您在构造函数中执行此操作,通常执行起来相当简单。

也就是说,您可以在 php.ini 中以不同的方式将共享功能放在全局范围内。最简单的是使用全局函数。例如。一个不属于任何类的函数。另一种选择是使用静态类方法。这两个非常相似;除了语法之外,它们本质上具有相同的属性。一个稍微松散的耦合解决方案是将功能作为方法放在(抽象)基类上,您的具体类从中扩展。这在所有子类之间共享功能。

上述解决方案的共同点是它们具有编译时耦合。您不能在运行时更改依赖关系,这会使您的应用程序相当僵化。它们的主要好处是它们的复杂性较低。

如果您想要一个松散耦合的应用程序,您可以尝试用变量替换硬依赖关系,以提供一定程度的间接性。最简单的方法是创建一个对象并使其在整个应用程序中全局共享。在 PHP 中有很多方法可以做到这一点,例如单例或只是全局范围内的变量(您可以使用global关键字或通过$GLOBALS数组访问它)。

虽然全局变量提供了一定程度的间接性,但它们也往往会引入很多复杂性,因为它们使得很难确定应用程序的哪些部分相互依赖。出于这个原因,有经验的程序员经常避免使用它们。如果变量具有状态,则尤其如此;如果共享对象是无状态的,这个问题就不那么普遍了。

避免全局变量危险的唯一方法是改用局部变量。例如。传递依赖关系。这可能有点麻烦,但根据我的经验,它通常没有想象的那么大。至少,好处往往大于问题。也就是说,有一些技巧可以减轻痛苦;尤其是依赖注入容器,它们是为您处理所有接线的自动工厂。虽然它们具有自己的复杂程度,但对于更大的应用程序,它们肯定是一个很好的解决方案。

于 2010-03-08T14:54:59.937 回答
-1

虽然有时是必要的,但单例是邪恶的(因为它们是全局状态)。如果可以的话,尽量避免它们。

编辑:如果你不能避免单例,至少参数化对该状态的引用。换句话说,在一个类中,将单例传递给它的构造函数或那些使用单例的方法。

简单地在你的代码库中引用你的单例将损害你单独测试类的能力。

如果你的单例是有状态的,你的测试会突然变成有状态的,你的测试可能会开始“级联失败”,因为它们的先决条件被早期的测试失败破坏了。

于 2010-03-08T13:28:36.560 回答