我有此代码:

class IC_Core {

    /**
     * Database
     * @var IC_Database
     */
    public static $db = NULL;

    /**
     * Core
     * @var IC_Core
     */
    protected static $_instance = NULL;

    private function __construct() {

    }

    public static function getInstance() {
        if ( ! is_object(self::$_instance)) {
            self::$_instance = new self();
            self::initialize(self::$_instance);
        }
        return self::$_instance;
    }

    private static function initialize(IC_Core $IC_Core) {
        self::$db = new IC_Database($IC_Core);
    }

}

但是当我想通过以下方式访问IC_Database时:

$IC = IC_Core::getInstance();
$IC->db->add() // it says that its not an object.

我认为问题出在self :: $ db = new IC_Database($ IC_Core);

但我不知道如何使它工作。

有人可以帮我吗=)

谢谢!

#1楼 票数:2 已采纳

在我看来, initialize应该是一个实例方法,而不是静态方法。 然后应该使用$this->db而不是self::$db

    public static function getInstance() {
        if ( ! is_object(self::$_instance)) {
            self::$_instance = new self();
            self::$_instance->initialize();
        }
        return self::$_instance;
    }

    private function initialize() {
        $this->db = new IC_Database($this);
    }

您甚至可以将initialize方法的内容放入构造函数中,这样就不必担心调用它。

#2楼 票数:1

$ db属性被声明为static因此您必须使用双冒号访问它。 箭头符号仅适用于非静态属性。

$IC = IC_Core::getInstance();
IC_Core::$db->add();

  ask by never_had_a_name translate from so

未解决问题?本站智能推荐:

11回复

在PHP中是否有用于数据库访问的单例的用例?

我通过PDO访问我的MySQL数据库。 我正在设置对数据库的访问权限,我的第一次尝试是使用以下内容: 我想到的第一件事就是global : 这被认为是一种不好的做法。 经过一番搜索后,我最终得到了Singleton模式 “适用于需要单个类实例的情况。” 根据手册中的示例,我
2回复

当需要全局访问时可以替代Singleton

我花了最后几个小时阅读有关单例模式以及为什么不使用它的信息,其中包括那些非常好的网站: Singleton我爱你,但你让我失望 如何在单元测试方面考虑“新”操作员 单身人士去哪儿了? 我想你们当中很多人已经知道这些。 看完之后看我的代码,我显然是误解和滥用单例模式的大约
3回复

全局类的正确的面向对象结构

使用单例类进行声音管理的利弊是什么? 我担心这在结构上非常反OOP,并且不希望被错误的路线束缚,但是还有什么更好的选择?
5回复

静态成员不是自己创建类(全局)对象吗?

每当我遇到单例模式或任何静态类的实现(即具有(几乎)仅静态成员的类)时,我想知道这是不是实际上是一个黑客,因此严重滥用类和实例的原则只是为了设计单个对象,而不是设计类和创建单个实例。 对我来说,它看起来像类的静态成员一般尝试向它们实际上不应该具有的类添加某种特性,而是让它们自己对象。 但是
2回复

在大型框架中定义和访问对象

在需要以某种方式实现的大型框架中定义包装类对象(在main外部)的一种好方法,可以从任何地方访问它们。 (例如,在诸如Player.cpp之类的游戏对象中使用Clock.Get_Deltatime()而在main.cpp中仍运行Clock.Update()) 我可以做这样的事情吗?
1回复

如果Singletons不好,那么如何存储框架的全局状态?

如果认为单例不利于全局状态,尤其是可能影响代码主要执行的状态,那么应该如何处理Web框架的全局状态? 立即想到的是: 基本网址 基本文件路径 常规配置 记录实例 等等 我无法看到除单例之外的其他访问方式,例如App()类或类似方法?
2回复

比单例更好的想法用于全局变量

我有一些班级应该使用的队列。 它是所有类的相同队列,所以我想也许我会将队列作为静态成员放入静态类中。 但是我知道这不是很好的面向对象操作(尽管我认为单例是设计模式之一),所以我想要一个实现此队列的想法,但我将需要它对所有类都是唯一的并且可以被所有类访问。类使用相同的队列。
4回复

Java:使单身人士更加冗长

为了帮助我学习Java和编程概念,我正在编写一个可以解决游戏PuzzleFreak中的难题的机器人 。 我已经把游戏的控制器变成了单身,因为应该只有一个。 但是,现在我到处都是Controller.getInstance() 。 我怎么能让这个更简洁? Singleton甚至可以去这里