[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Singletone. Хочу убедится что понял
m4a1fox
Все привет! Итак, читаю книгу М. Зандстра (не так оказалась легка, как я читал про нее описание, ну или я туп :) - второе вернее...). Так вот. Есть у него Singletone. Хочу убедиться правильно ли я его понял. Вот код из книги

<?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.
Цитата
Да, он вернет новый экземпляр - но СТРОГО один раз.
Т.е. пр след вызове новый экзмпляр не создаться, т.е мы модем быть уверены, что у нас всего один экземпляр.

Тогда еще вопрос! А зачем удалять ссылку то после того как он создался? Тем более, кажется, удаяя ссылку - мы не удаляем объект. Т.Е. его можно еще раз вызвать - что и происходит вот тут

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. Есть такая весчь и работает она так
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() не будет.

Спасибо! Значит я таки правильно понял суть этого скрипта. Осталось понять в каких конкретных ситуациях он применяется. А то получается смотрю в книгу вижу фигу smile.gif

Спустя 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 - А тут показано как он красиво может работать в паре с магическими методами



Спустя 1 час, 27 минут, 23 секунды (21.11.2011 - 03:26) caballero написал(а):

И близко нет таких файлов в исходниках.

Цитата
Контроллер и вьювер могут без препятствий использовать супер класс (т.е. сам контроллер), а вот модель оказывается совсем в другой среде исполнения и в данном месте, Синглетон встает чудесным спасителем, который позволяет совместить эти две разные области


какая связь между синглетоном суперклассом и MVC?


Синглтону вообще нечего делать в MVC при нормальной архитектуре.
Впрочем, при нормальной архитектуре, MVC нечего делать в вэбе вообще (отсюда и проблемммы как все это совместить).

Спустя 3 дня, 11 часов, 19 секунд (24.11.2011 - 14:26) Zerstoren написал(а):
Ну вот и синглтон и решает эту проблему.

>>> И близко нет таких файлов в исходниках.
А если найду?

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.