<?php
class Preferences{
private $props = array();
private static $instance;
private function __constract(){}
public static function getInstance(){
if(empty(self::$instance)){
self::$instance = new Preferences();
}
return self::$instance;
}
public function setProperty($key, $val){
$this->props[$key] = $val;
}
public function getProperty($key){
return $this->props[$key];
}
}
$pref = Preferences::getInstance();
$pref->setProperty('name', 'Иван');
unset($pref);
$pref2 = Preferences::getInstance();
echo $pref2->getProperty('name');
?>
То есть тут по сути, мы смогли объявить объект класса, кот. просто так $pref = new Preferences(); нельзя было объявить, так как метод конструктора - закрыт. Значит, применив вот этот метод
public static function getInstance(){
if(empty(self::$instance)){
self::$instance = new Preferences();
}
return self::$instance;
}
по сути, мы объявили закрытую переменную $instance - сделав ее ссылкой, на собственный класс. И тогда, наша запись вот эта
$pref = Preferences::getInstance();
$pref->setProperty('name', 'Иван');
unset($pref);
$pref2 = Preferences::getInstance();
echo $pref2->getProperty('name');
По сути равна, вот такой
$pref = new Preferences(); // так как метод getInstance() вернет нам, судя по коду - new Preferences()
$pref->setProperty('name', 'Иван');
unset($pref);
$pref2 = Preferences::getInstance();
echo $pref2->getProperty('name');
Так это или нет?
Спустя 3 минуты, 55 секунд (17.11.2011 - 18:42) vital написал(а):
Цитата |
$pref = new Preferences(); // так как метод getInstance() вернет нам, судя по коду - new Preferences() |
Да, он вернет новый экземпляр - но СТРОГО один раз.
Т.е. пр след вызове новый экзмпляр не создаться, т.е мы модем быть уверены, что у нас всего один экземпляр.
$pref = new Preferences();не сработает, т.к. конструктор закрыт.
И еще.
private function __constract(){}
стоит поправить.
Спустя 2 минуты, 6 секунд (17.11.2011 - 18:44) m4a1fox написал(а):
vital
Загляни в аську!
Загляни в аську!
Спустя 1 минута, 12 секунд (17.11.2011 - 18:46) m4a1fox написал(а):
vital
Цитата |
__constract(){} |
Опа-на. Спасибо! Перешел на Notepad++ - он то не исправляет:)
P.S.
P.S.
Цитата |
Да, он вернет новый экземпляр - но СТРОГО один раз. Т.е. пр след вызове новый экзмпляр не создаться, т.е мы модем быть уверены, что у нас всего один экземпляр. |
Тогда еще вопрос! А зачем удалять ссылку то после того как он создался? Тем более, кажется, удаяя ссылку - мы не удаляем объект. Т.Е. его можно еще раз вызвать - что и происходит вот тут
unset($pref);
$pref2 = Preferences::getInstance();
echo $pref2->getProperty('name');
После чего снова, объявляем $pref2 = Preferences::getInstance();. и у нас снова - есть $pref2 = new Preferences(); - так же?
И уже обращаясь к методу - $pref2->getProperty('name'); мы получаем на выходе слово.
Спустя 7 минут, 16 секунд (17.11.2011 - 18:53) vital написал(а):
Цитата (m4a1fox @ 17.11.2011 - 17:44) |
vital Загляни в аську! |
я на работе, хз когад уйду.
Спустя 13 часов, 27 минут, 17 секунд (18.11.2011 - 08:20) linker написал(а):
unset($pref); удаляет ссылку на объект, но не сам объект, ибо объект удаляется, когда удаляются все ссылки на него. Т.е. нужно удалить не только $pref, но и Preferences::$instance, вот тогда объект будет гарантированно удалён. Поэтому, после unset($pref); новый вызов Preferences::getInstance(); вернёт новую ссылку на старый объект и никаких new Preferences() не будет.
P.S. Есть такая весчь и работает она так
P.S. Есть такая весчь и работает она так
self::$instance = new self();дабы не привязываться лишний раз к названию класса.
Спустя 3 часа, 56 минут, 49 секунд (18.11.2011 - 12:17) m4a1fox написал(а):
linker
Цитата |
unset($pref); удаляет ссылку на объект, но не сам объект, ибо объект удаляется, когда удаляются все ссылки на него. Т.е. нужно удалить не только $pref, но и Preferences::$instance, вот тогда объект будет гарантированно удалён. Поэтому, после unset($pref); новый вызов Preferences::getInstance(); вернёт новую ссылку на старый объект и никаких new Preferences() не будет. |
Спасибо! Значит я таки правильно понял суть этого скрипта. Осталось понять в каких конкретных ситуациях он применяется. А то получается смотрю в книгу вижу фигу
Спустя 51 минута, 20 секунд (18.11.2011 - 13:08) caballero написал(а):
Цитата |
А зачем удалять ссылку то после того как он создался? |
А кто сказал что ее надо удалять
Все что тебе нужно было - ограничется перваой частью твоего первого поста.
Цитата |
Осталось понять в каких конкретных ситуациях он применяется. |
в 95% случаев в PHP это соединение с БД
Спустя 16 минут (18.11.2011 - 13:24) m4a1fox написал(а):
caballero
Цитата |
в 95% случаев в PHP это соединение с БД |
О! Спасибо! Буду знать!
Спустя 2 дня, 12 часов, 34 минуты (21.11.2011 - 01:58) Zerstoren написал(а):
>>>Спасибо! Значит я таки правильно понял суть этого скрипта. Осталось понять в каких конкретных ситуациях он применяется. А то получается смотрю в книгу вижу фигу
Вообще это полезно, когда мы делаем MVC. Контроллер и вьювер могут без препятствий использовать супер класс (т.е. сам контроллер), а вот модель оказывается совсем в другой среде исполнения и в данном месте, Синглетон встает чудесным спасителем, который позволяет совместить эти две разные области.
Можете почитать исходники CodeIgniterа, там все очень круто видно.
Файлы которые нужно будет почитать в папке system:
CodeIgniter.php - собирает все вместе
CI_Controller.php - Вот тут спрятан сам get_instance
CI_Model.php - А тут показано как он красиво может работать в паре с магическими методами
Вообще это полезно, когда мы делаем MVC. Контроллер и вьювер могут без препятствий использовать супер класс (т.е. сам контроллер), а вот модель оказывается совсем в другой среде исполнения и в данном месте, Синглетон встает чудесным спасителем, который позволяет совместить эти две разные области.
Можете почитать исходники CodeIgniterа, там все очень круто видно.
Файлы которые нужно будет почитать в папке system:
CodeIgniter.php - собирает все вместе
CI_Controller.php - Вот тут спрятан сам get_instance
CI_Model.php - А тут показано как он красиво может работать в паре с магическими методами
Спустя 1 час, 27 минут, 23 секунды (21.11.2011 - 03:26) caballero написал(а):
И близко нет таких файлов в исходниках.
Цитата |
Контроллер и вьювер могут без препятствий использовать супер класс (т.е. сам контроллер), а вот модель оказывается совсем в другой среде исполнения и в данном месте, Синглетон встает чудесным спасителем, который позволяет совместить эти две разные области |
какая связь между синглетоном суперклассом и MVC?
Синглтону вообще нечего делать в MVC при нормальной архитектуре.
Впрочем, при нормальной архитектуре, MVC нечего делать в вэбе вообще (отсюда и проблемммы как все это совместить).
Спустя 3 дня, 11 часов, 19 секунд (24.11.2011 - 14:26) Zerstoren написал(а):
Ну вот и синглтон и решает эту проблему.
>>> И близко нет таких файлов в исходниках.
А если найду?
>>> И близко нет таких файлов в исходниках.
А если найду?