[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Полностью ООП архетекрура сайта
haZe
Здравствуйте, господа!
Будьте так добры, помочь мне понять такую вещь как ООП архитектура.
Читал решения zend-а, разбирал livestreet, придумывал свои варианты но все равно так и не понял полностью, как это сделать. В принципе проблема в простейшей логике "что к чему".
Где-то вычитал, что наследовать можно только один класс, но зато можно создать экземпляр класса внутри метода. Ну класс в классе получается. Так же, что родительским классом, лучше выбирать Exception, для ловли ошибок.
Собсна придумал такую хрень, что класс, который "соображает" что делать, то есть какой модуль подключить и пр. наследуется от Exception, а все остальные классы (работа с БД, шаблонизатор, модули и пр.) просто создается внутри него.
Но увы такой метод не работает.
То есть например какому-то модулю требуется и работа с БД и шаблонизатор и UI, но он просто не видит этих методов.
Может быть, кто нить будь, сможет мне понятно подсказать? Заранее благодарю!

PS модераторы, поправьте пожалуйста заголовок! "полностью" unsure.gif



Спустя 13 минут, 28 секунд (7.10.2009 - 13:12) glock18 написал(а):
Собственно, exception используется не для того, чтобы поддерживать всю структуру. Exception - это исключение. И используется преимущественно в связке try-catch, как правило, для отлова ошибок.

Цитата
То есть например какому-то модулю требуется и работа с БД и шаблонизатор и UI, но он просто не видит этих методов.


бд, шаблонизатор и аналогичные сущности лучше всего делать при помощи паттерна синглтон. Соответственно, если какой-то модуль использует их, в нем просто нужно обращаться этому самому объекту (который синглтон). Если их несколько, то к нескольким.

Спустя 7 часов, 12 минут, 1 секунда (7.10.2009 - 20:24) haZe написал(а):
Пол дня копался, не нашел ни одного примера, как пользоваться синглтонами внутри класса. Не мог бы ты объяснить более подробно?

Спустя 36 минут, 2 секунды (7.10.2009 - 21:00) glock18 написал(а):
ну например что-то типа:

PHP
class TemplateEngine
{
  private 
$instance null;
// singleton access
  
public static getInstance()
  {
    if (
self::$instance === null)
    {
      
self::$instance = new self();
    }

    return 
self::$instance;
  }

//incapsulated constuctor
  
private function __construct() {}
}

class 
AnotherClass
{
  public function 
doSomething()
  {
    
$tplEngine TemplateEngine::getInstance();
    
// do what ever you want
  
}
}

Спустя 1 день, 36 минут, 57 секунд (8.10.2009 - 21:37) haZe написал(а):
Насколько я понял TemplateEngine вызывается из любого места и только один раз. И если он уже создан, то он не создается, а возвращается только экземпляр?
Правильно я понял?
А могу я скажем TemplateEngine положить в отдельный файл и подключаеть его прямо внутри AnotherClass? Будет ли он виден другим классам также подключенным?

Спустя 39 минут, 14 секунд (8.10.2009 - 22:16) glock18 написал(а):
Цитата
А могу я скажем TemplateEngine положить в отдельный файл и подключаеть его прямо внутри AnotherClass? Будет ли он виден другим классам также подключенным?


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

Спустя 7 минут, 30 секунд (8.10.2009 - 22:24) haZe написал(а):
О, это замечательно.
Цитата
подключать класс внутри класс не имеет смысла

Это я с целью экономии. Чтоб не подключать ненужные классы. Ведь скажем если дофига здоровенных модулей, то подключать сразу все.. это по моему слишком. Лучше только тот, который надо. Или это плохо?

Спустя 7 минут, 1 секунда (8.10.2009 - 22:31) glock18 написал(а):
Цитата
Это я с целью экономии. Чтоб не подключать ненужные классы. Ведь скажем если дофига здоровенных модулей, то подключать сразу все.. это по моему слишком. Лучше только тот, который надо. Или это плохо?


ну 2 варианта помимо неконтролируемой загрузки классов:
1. __autoload - функция для автозагрузки классов. погугли про нее - это самый лучший вариант.
2. include_once в начале файла с классов для всех его зависимых классов. так подключаешь AnotherClass и уже он подключает то, что ему нужно.

Спустя 5 минут, 38 секунд (8.10.2009 - 22:37) haZe написал(а):
Да, про __autoload слышал, но не совсем понял. Вроде автоматом ищет классы в файлах при попытке их создания?
Насколько я понимаю этого достаточно:
PHP
function __autoload($class_name) { 
     include_once
("includes/" . $class_name . "php"); 
}


Просто каждый класс надо класть в отдельный файл с таким же названием.

Спустя 11 минут, 53 секунды (8.10.2009 - 22:48) glock18 написал(а):
можно так.

Спустя 13 минут, 35 секунд (8.10.2009 - 23:02) haZe написал(а):
Супер! Спасибо тебе огромное!!!!!!
Буду пробовать теперь собирать все.

Спустя 2 часа, 18 минут, 21 секунда (9.10.2009 - 01:20) haZe написал(а):
небольшая поправочка, а вернее ошибочка.
Так не работает:
PHP
private $instance null;

Только так:
PHP
private static $instance null;

Спустя 8 часов, 7 минут, 34 секунды (9.10.2009 - 09:28) glock18 написал(а):
да, верно.

Спустя 3 дня, 18 часов, 20 минут, 26 секунд (13.10.2009 - 03:48) haZe написал(а):
А как запустить класс через синглтон, имя которого лежит в переменной?
т.е. TemplateEngine надо заменить на переменную в
$tplEngine = TemplateEngine::getInstance();

Спустя 5 часов, 53 минуты, 14 секунд (13.10.2009 - 09:42) glock18 написал(а):
TemplateEngine::getInstance()->yourMethod ????

Спустя 3 часа, 8 минут, 5 секунд (13.10.2009 - 12:50) haZe написал(а):
нет
что-то вроде:
$class = "TemplateEngine";
$tplEngine = $class::getInstance();

Спустя 18 минут, 16 секунд (13.10.2009 - 13:08) glock18 написал(а):
возможно с 5.3 версии smile.gif
я бы обращался в тот же класс, просто передавал бы параметр, по которому определял бы какой класс создавать. что-то типа паттерна "фабрика".

Спустя 32 минуты, 32 секунды (13.10.2009 - 13:40) haZe написал(а):
эммм не понял... Надо создавать большой case????

Спустя 21 минута, 46 секунд (13.10.2009 - 14:02) glock18 написал(а):
haZe
ну это дело твое. хоть case, хоть не case. вариантом вагон и тележка smile.gif

Спустя 45 минут, 16 секунд (13.10.2009 - 14:47) haZe написал(а):
эммм, то есть только через метод множественного выбора?
Быстрый ответ:

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