【问题标题】:CodeIgniter - Singleton pattern not allowed?CodeIgniter - 不允许单例模式?
【发布时间】:2011-03-22 20:13:29
【问题描述】:

我正在尝试在我创建的类中使用单例模式。我正在使用 CodeIgniter,它似乎要求所有模型对象的构造函数都是公开的。

有没有办法解决这个问题?如果我不能使用单例模式,最好的方法是什么?

我的班级:

class RakebackSites extends CI_Model {

    private $allSites = array(); 

    private function __construct() {
        parent::__construct();
        self::initAllSites();
    }

    public static function getInstance() {
        if(empty(self::$instance)) {
            self::$instance = new CurrencyTypes();
        }
        return self::$instance;
    }

    private function initAllSites() {
        $sql = "SELECT * FROM rakeback_sites";
        $this->db->query($sql);
        foreach ($q->result() as $row) {
            $allSites[] = new RBSite($row->id, $row->name, $row->logo, $row->rakeback, $row->sign_up_bonus, $row->sign_up_bonus_currency, $row->referral_code, $row->id);
        }
    }

    public function getAllSites() {
        return $this->allSites;
    }
}

我得到的错误:

致命错误:RakebackSites::__construct() 的访问级别必须在 /home/.../application/models/rakebacksites.php 第 29 行中公开(如 CI_Model 类)

【问题讨论】:

    标签: codeigniter singleton


    【解决方案1】:

    如果我没记错的话,如果你通过 $this->load->model('Your_model') 加载,CI 会自动有效地创建单例。显然,仍然可以直接实例化,但是......只是不要这样做。或者,不要从 CI_Model 继承。

    【讨论】:

      【解决方案2】:

      它是否允许您将构造函数声明为受保护而不是私有?不完全是单例,但这仍然适用于您的目的吗?

      【讨论】:

      • 不幸的是不是,它告诉我它必须是公开的
      【解决方案3】:

      将构造函数设为私有或受保护与单例模式没有任何关系。您所做的只是定义一个无法直接实例化的抽象类。

      要生成单例,您需要重写 new() 方法或实现类工厂。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-22
        • 1970-01-01
        • 1970-01-01
        • 2012-12-19
        • 2023-02-05
        • 2011-05-05
        相关资源
        最近更新 更多