OOPHP适合替代单身模式?

时间:2009-10-31 14:32:01

标签: php singleton

我目前正在开发oophp应用程序。我有一个网站类,其中包含应用程序的所有配置设置。最初,我打算使用单例模式允许每个对象引用站点对象的单个实例,但主要是由于此模式中涉及的测试问题,我决定尝试不同的方法。

我想使网站类成为我的应用程序中的主要父类,并从子类的构造函数中调用它的构造函数,以便在需要时使所有属性可用。

第一次运行时,该类将仅包含应用程序的数据库详细信息。要获取剩余值,必须使用db详细信息执行查询。但是,任何后续实例都将是原始克隆(包含所有值)。我也可以设置一个布尔标志来再次执行查询,需要一个全新的实例。

这会成为单身人士的可行替代方案吗?它会解决它导致的测试问题吗?这是理论上的全部,我还没有开始编码,

任何想法或建议都非常感谢。 感谢。

2 个答案:

答案 0 :(得分:3)

我认为更好的方法是让一个'配置'对象传递给所有其他类的构造函数。所以,几乎像单身一样,除了它是明确创建并只传递给需要它的类。这种方法通常称为dependency injection

答案 1 :(得分:2)

在尝试了许多不同的技术之后,我发现这种方法的功能性和可靠性是:

使用引导程序或初始化文件。它位于站点的ROOT,具有适当的许可和防止直接访问的安全措施。

网站中的所有网页都首先包含此文件。在其中,我创建了所有的全局对象(设置,用户),并从那里引用它们。

例如:

// OBJECT CREATION
$Config = new Configuration();
$User = new User();

然后在需要这些对象的类中:

public function __construct($id = NULL) {
    global $Config; // DEPENDENCY INJECTION SOUNDS LIKE AN ADDICTION!

    if($Config->allow_something) {
        $this->can_do_something = true;
    }

    if(NULL !== $id) {
        $this->load_record($id);
    }
}

请注意,我只是从类中访问这些全局对象,以及我不必每次都将对象变量包含为第一个构造函数参数。那变老了。

此外,拥有静态数据库类非常有帮助。没有对象我不得不担心传球,我可以打电话给$row = DB::select_row($sql_statement);;看看PhpConsole课程。

UPDATE 感谢upvote,无论谁做到了。它引起了人们的注意,我的答案不是我引以为豪的事实。虽然它可能有助于OP完成他们想要的东西,但这不是一个好习惯。

将对象传递给新的对象构造函数是一种很好的做法(依赖注入),虽然“不方便”,但与生活中的其他事情一样,额外的努力是值得的。

我的答案中唯一的救赎部分是使用外观模式(例如DB :: select_row())。这不一定是单身(OP想要避免的东西),并且让您有机会展示精简的界面。

Laravel是一个现代的PHP框架,它使用依赖注入和外观,以及其他经过验证的设计模式。我建议任何新手开发人员都要彻底审查这些和其他此类设计实践。