За последние 24 часа нас посетили 62845 программистов и 1743 робота. Сейчас ищут 2193 программиста ...

Реализация "Драйверов"

Тема в разделе "Прочие вопросы по PHP", создана пользователем Mr.M.I.T., 16 май 2009.

  1. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Начал писать шаблонизатор с поддержкой "Дров" сел в лужу
    нужно чтобы класс "конструктор" работал с "драйвером" через свой интерфейс
    написал такое, пахнет бредом

    PHP:
    1.  
    2. <?
    3. class TPL {
    4.     const INDEX=true;
    5.     private static $class=false;
    6.     protected $cnf=array("tpl_dir"=>"tpl","tpl_skin"=>"default",
    7. "tpl_cache_on"=>1,"tpl_cache_time"=>120,"tpl_cache_dir"=>"ctpl",
    8. "tpl_posttags_name"=>"postcache","tpl_posttags_ident_name"=>"____POSTCACHE____");
    9.     function __call($name,$attrs){
    10.         $res=false;
    11.         if(!empty($attrs)) $attrs=$this->TransAttrs($attrs);
    12.         if(!method_exists($this,$name)){
    13.            if(method_exists(self::$class,$name)){
    14.                eval('$res=self::$class->'.$name.'('.$attrs.');');
    15.            }else{
    16.               trigger_error("Метод $name не существует",E_USER_ERROR);
    17.            }
    18.         }else eval('$res=$this->'.$name.'('.$attrs.');');
    19.         return $res;
    20.     }
    21.     function __construct ($cnf,$driver='native'){
    22.        $obj=false;
    23.        $class="TPL_Driver_".$driver;
    24.        if(class_exists($class)){
    25.            self::$class=new $class;
    26.            $this->cnf=$cnf;
    27.        }else{
    28.            trigger_error("Драйвер '$class' не существует",E_USER_ERROR);
    29.        }
    30.     }
    31.     private function TransAttrs($attrs){
    32.         $res=array();
    33.         for($i=0,$c=count($attrs);$i<$c;$i++){
    34.             if(!is_array($attrs[$i])){
    35.                 $res[]="'".addslashes($attrs[$i])."'";
    36.             }else{
    37.                 $res[]=var_export($attrs[$i],1);
    38.             }
    39.         }
    40.         return implode(",",$res);
    41.     }
    42. }
    43. ?>
     
  2. http://ru.wikipedia.org/wiki/Фабричный_метод_(шаблон_проектирования)

    Читать. Потом бежать, покупать Фаулера. )
     
  3. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    точно блин, дафненько не программил =)
    а по паттернам у меня есть хорошие книжки
     
  4. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    ой, что-то у меня голова совсем не варит сегодня, вот ещё из другой оперы
    PHP:
    1. <?
    2. class Main extends Factory{
    3.     static $class=false;
    4.     function __constrcut(){
    5.          self::$class=parent::Load();
    6.     }
    7.     function MyName(){
    8.         print "Im part of Main class methods<br>";
    9.     }
    10. }
    11. class Factory {
    12.     static function Load(){
    13.         return new Driver();
    14.     }
    15. }
    16. class Driver {
    17.    function GetName(){
    18.        print "Good Job!";
    19.    }
    20. }
    21.  
    22. $c=new Main();
    23. $c->MyName();   //
    24. $c->GetName(); // Как Сделать?
    25. ?>
    обратится из Main к методу драйвера GetName
     
  5. Cron

    Cron Активный пользователь

    С нами с:
    10 июл 2008
    Сообщения:
    289
    Симпатии:
    0
    Адрес:
    Украина, Сумы
    Вот так:

    PHP:
    1. Main::$class->GetName();
    Но, я так понимаю, ты не это хотел реализовать... Какая задача стояла изначально?
     
  6. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Cron
    =)) так то понятно что можно
    а мне надо включить функционал драйвера в класс Main
    короче чтобы можно было так
    Сделал я это с помощью eval'а, похожим образом как в коде в первом посте
    Пс. Прошу заметить это уже не касается шаблонизатора, просто схожая проблема но в другой части системы
     
  7. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Mr.M.I.T.
    Ты просыпайся давай: фабрика - это фабрика. Содержит загрузчик драйверов и, возможно, некоторый общий функционал. У нее должен быть только один публичный метод: создать драйвер. Все.
     
  8. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    AlexGousev
    да это не фабрика, с шаблонизатором я разобрался
    короче этот класс, это обёртка НАД DBSimple Factory фабрика DBSimple, Driver это её драйвер, например MySql
     
  9. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Mr.M.I.T.
    А похоже на фабрику. И то, что она фабрика драйверов БД не делает ее принципиально отличной от фабрики шаблонов ;-)
     
  10. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    AlexGousev
    это ясно, но посмотри
    фабрика это Factory, она вернёт класс драйвера
    теперь мне нужно включить функционал класса драйвера в класс Main и при этом сохранить функционал класса Main, своего рода наследование
    Короче, без евала никак?
     
  11. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Перегрузка?
     
  12. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    рассказывай изначальную задачу. Потому что то, что ты хочешь сделать - костыль на костыле
     
  13. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    [vs]
    так и сделал, пока, не нравится мне
    AlexGousev
    Обёртку над ДБСимпле, класс main будет включать в себя всякие методы упрощающие работу с ДБСимпле
    при этом мне надо иметь возможность обращатся к методам драйвера ДБСимпле, так же как к методам класса Main, иными словами мне нужно унаследовать класс-драйвер который возвращает Фабрика ДБСимпле
     
  14. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Mr.M.I.T.
    А взять и внести изменения в эту дбсимпле?
     
  15. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    AlexGousev
    мм нет, думаю нет, как это нехорошо чтоли будет?.. лучше уж перезагрузка
    да и тем более, впринципе, в евале нет ничего плохого =)
     
  16. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    оставлю пожалуй как есть, впринципе нечё плохого