2013-06-08 3 views
3

У меня есть следующие четыре PHP файлы:Структура Singleton

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. 

Что происходит не так? Спасибо за помощь.

+0

[Этот ответ] (http://stackoverflow.com/a/2085988/212940) должен предоставить вам интересное чтение. – vascowhite

ответ

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 как базовый класс для соединений базы данных и регистраторов: он может удерживать только один или другой.

+0

Это работает как шарм - исправьте его, но мы должны использовать - новый статический. Старая версия PHP (x <5.3) не сможет решить эту проблему, так? – RePRO

+0

Для более старых версий PHP 5 существует обходное решение с использованием 'ReflectionClass', вы можете найти его в комментариях здесь: http://www.php.net/manual/en/language.oop5.late-static-bindings.php – Joni

+0

Мы может подвести итог, что проблема заключается в поздних статических привязках. Еще раз спасибо за четкие ответы. – RePRO