单身人士的结构

时间:2013-06-08 17:58:15

标签: php design-patterns singleton

我有以下四个PHP文件:

1。 Singleton.php

<?php

class Singleton {
    private static $instance = null;

    protected function __clone() {}
    private function __construct() {}

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

?>

2。 Debugger.php

<?php

interface Debugger {
    public function debug($message);
}

?>

3。 DebuggerEcho.php

<?php
require_once 'Singleton.php';
require_once 'Debugger.php';

class DebuggerEcho extends Singleton implements Debugger {
    public function debug($message) {
        echo $message . PHP_EOL;
    }
}

?>

4。 TestSingleton.php

<?php
require_once 'DebuggerEcho.php';

$debugger = DebuggerEcho::getInstance();
$debugger->debug('Hello world');

?>

问题是,当我拨打专线$debugger->debug('Hello world')时。我想保留这个结构,但避免这个(经典)消息:

Call to undefined method Singleton::debug() in TestSingleton.php.

出了什么问题?谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

表达式new self创建一个包含它的类的对象;这里Singleton。要创建用于调用的类的对象,可以使用new static代替(假设您使用的是PHP 5.3或更高版本):

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

另请参阅:What does new self(); mean in PHP?

并不是Singleton的这种实现不能真正重用,因为它只支持一个实例。例如,您不能将此Singleton类用作数据库连接和记录器的基类:它只能保存一个或另一个。