3

次の 4 つの 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');

?>

問題は、 line を呼び出すときです$debugger->debug('Hello world')。この構造を維持したいが、この (古典的な) メッセージは避けたい:

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

何がうまくいかないのですか?ご協力ありがとう御座います。

4

1 に答える 1

2

new selfは、それが含まれているクラスのオブジェクトを作成します。ここにSingleton。代わりに使用できる呼び出しに使用するクラスのオブジェクトを作成するにはnew static(PHP 5.3 以降を使用していると仮定します):

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

参照: new self(); とは何ですか? PHPで意味?

のこの実装は、Singleton1 つのインスタンスしかサポートしないため、実際には再利用できないわけではありません。たとえば、このSingletonクラスをデータベース接続とロガーの両方の基底クラスとして使用することはできません。保持できるのはどちらか一方だけです。

于 2013-06-08T18:10:32.470 に答える