2009-11-23 4 views
0

Чтобы уточнить:Singleton шаблон + __construct в PHP4

  • нет, я не могу сделать это чисто PHP5
  • да этот код работает в PHP 4.3.9.

У меня нет опыта реального мира, реализующего или поддерживающего PHP4, но мне пришлось недавно изменить свой класс, чтобы он поддерживал как PHP4, так и PHP5.

  • Может ли кто-нибудь предвидеть любые возможные проблемы в отношении моей реализации метода singleton, используемого здесь? Мне нужен только один экземпляр этого класса.
  • Я знаю, что могу полностью избавиться от метода __construct, должен ли я? (и переместить тело функции из него в функцию Conf).
  • Могу ли я использовать self в любом месте? Я не был уверен в поддержке PHP4.

<?php 

class Conf { 
    function Conf($filename) { 
     $this->__construct($filename); 
    } 

    function __construct($filename) { 
     echo $filename; 
    } 

    function getInstance($filename) { 
     static $instance = null; 
     if ($instance == null) { 
      $instance = new Conf($filename); 
     } 
     return $instance; 
    } 
} 

$x = Conf::getInstance('file.xml'); 

ответ

1

Чтобы обойти недоступность self в PHP4, вы должны изменить способ getInstance к следующему:

class Conf { 
    function Conf($filename) { 
     $this->__construct($filename); 
    } 

    function getInstance($filename) { 
     static $instance = null; 
     if ($instance == null) { 
      $class = __CLASS__; 
      $instance = new $class($filename); 
     } 
     return $instance; 
    } 

    // Don't forget to block cloning 
    function __clone() { 
     trigger_error("Cannot clone a singleton", E_USER_WARNING); 
    } 
} 

Edit: Потому что __CLASS__ всегда будут именем класса класса, в котором была определена функция , чтобы поддерживать наследование, вы должны переопределить метод getInstance в каждом дочернем классе.

class Conf2 extends Conf { 
    function newMethod() { echo "Do something"; } 

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

Это перетащить, да, но если вы используете вышеуказанный метод, вы можете просто скопировать и вставить. Я считаю, что это исправлено в PHP 5.3 с late static binding, но я еще не установил его для подтверждения.

+0

Интересно. Это значит, что '__CLASS__' в основном является заменой' self', поскольку PHP4 не может поддерживать 'self'? –

+0

Yup, '__CLASS__' - волшебная константа (http://us2.php.net/manual/en/language.constants.predefined.php). –

0

Ваш код является излишне сложным. Вам не нужен метод __construct вообще, если у вас есть другой. (или наоборот, старые версии php не поддерживают __construct)

Кроме того, чтобы реализовать шаблон singleton правильно, статический экземпляр должен быть классом, а конструктор должен быть закрытым.

class Singleton { 
    private static $instance; 

    private function Singleton(){ 
     //do stuff 
    } 

    function getInstance(){ 
     if(self::$instance == null){ 
      self::$instance = new Singleton(); 
     } 

     return self::$instance; 
    } 
} 

This article описывает, как реализовать шаблон Singleton в PHP4, и это проблемы.

+0

Да, я знаю о сделке '__construct', я думаю, я должен просто полностью ее убить. Не могли бы вы продемонстрировать, как вы это сделаете правильно? –

+0

также следует знать, что это __clone(), он может дублировать объект, и если вы не хотите, чтобы это происходило (что не должно допускаться в истинном шаблоне singelton), вы должны переопределить его и вернуть null или умереть. – Malfist

+0

@Malfist - ваш обновленный код - это именно то, как у меня был код PHP5. Я знаю эту статью, я просто искал совета для тех, кто знал точно трюки, реализованные в указанной статье в моем контексте. –

Смежные вопросы