【问题标题】:How to get instance of a singleton PHP class while extending it?如何在扩展单例 PHP 类时获取它的实例?
【发布时间】:2011-05-29 16:49:58
【问题描述】:

我的项目中有一个特定的类,用于加载和保存其他所有内容,例如库和模块。

例如;

index.php
---------
require_once "Libs/Damn.php";
$damn = Damn::getInstance();

// Initialize the URI class for handling user's request.
$damn->load('URI');
$damn->load('Modules');
$damn->load('Views');

if($damn->URI->module){
    $damn->Modules->load($damn->URI->module);
} else {
    $damn->Modules->load('main');
}

它只是加载 3 个库并在 URL 中查找模块名称。如果找不到,它会加载名为“main”(main.php)的模块。

这就是问题所在;

当我在 main.php 中扩展 Damn 类时,我无法访问加载的库,如 URI、模块,但我想访问。似乎扩展一个单例类并没有获取该类的实例,只是复制它。

我希望能够使用这样的模块类;

main.php
--------
<?php
if (!defined('SECURED')) die('Access denied.');

class Main extends Damn {

    public function __construct() {}

    public function index() {
        $this->Views->load('test'); //Views library already loaded when Damn initiated.
    }

    public function __destruct() {}

}

?>

【问题讨论】:

    标签: php design-patterns frameworks singleton


    【解决方案1】:

    你实际上并没有扩展 Damn。您创建了一个从 Damn 扩展的新类。您的原始类不受影响,单例实例中的数据不会神奇地复制到新类中。

    这里最好的(嗯,“好”)解决方案不是从 Damn 扩展 Main,而是创建一个新的 Main 类,使用 Damn 来管理模型。

    根据较早的单例实例的属性来更改单例实例的类型是不合逻辑的。这闻起来像糟糕的设计:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      相关资源
      最近更新 更多