PHP OOP单例不返回对象

时间:2010-11-27 23:49:07

标签: php oop singleton

奇怪的麻烦。我已经多次使用过单身,但这个特殊情况只是不想工作。转储表示该实例为空。

define('ROOT', "/");
define('INC', 'includes/');
define('CLS', 'classes/');

require_once(CLS.'Core/Core.class.php');

$core = Core::getInstance();

var_dump($core->instance);

$core->settings(INC.'config.php');
$core->go();

核心课程

class Core
{
    static $instance;

    public $db;
    public $created = false;

    private function __construct()
    {
        $this->created = true;
    }   

    static function getInstance()
    {       
        if(!self::$instance) {
            self::$instance = new Core();
        } else {
            return self::$instance;
        }
    }

    public function settings($path = null)
    {
        ...
    }
    public function go()
    {
        ...
    }

}

错误代码

Fatal error: Call to a member function settings() on a non-object in path

这可能是一些愚蠢的错字,但我的编辑器中没有任何错误。感谢您一如既往的快速反应。

3 个答案:

答案 0 :(得分:9)

您需要始终从单例方法返回单例对象,这不是因为您有else语句,因此getInstance的第一次调用不会返回任何内容:

static function getInstance()
{       
    if(!self::$instance) {
        self::$instance = new Core();
    } else {
        return self::$instance;
    }
}

您的单例方法应如下所示:

static function getInstance()
{       
    if(!self::$instance) {
        self::$instance = new Core();
    }
    return self::$instance;
}

此外,拥有一个表示对象是否已创建的实例变量几乎没用,因为您只需比较if(self::$instance !== NULL)就可以了。

答案 1 :(得分:2)

getInstance 总是返回一个值 - 需要像这样改变:

static function getInstance()
{       
    if(!self::$instance) {
        self::$instance = new Core();
    }
    return self::$instance;
}

答案 2 :(得分:0)

除了需要将getInstance()方法更改为:

static function getInstance() {       
    if(!self::$instance) {
        self::$instance = new Core();
    }
    return self::$instance;
}

...您还试图在以下调用中从实例本身取消引用$ instance:

var_dump($core->instance);

您应该检查:

var_dump($core);

var_dump(Core::$instance);

...在$ core = Core :: getInstance()调用之后,应该是同一个对象。