Начал писать шаблонизатор с поддержкой "Дров" сел в лужу нужно чтобы класс "конструктор" работал с "драйвером" через свой интерфейс написал такое, пахнет бредом PHP: <? class TPL { const INDEX=true; private static $class=false; protected $cnf=array("tpl_dir"=>"tpl","tpl_skin"=>"default", "tpl_cache_on"=>1,"tpl_cache_time"=>120,"tpl_cache_dir"=>"ctpl", "tpl_posttags_name"=>"postcache","tpl_posttags_ident_name"=>"____POSTCACHE____"); function __call($name,$attrs){ $res=false; if(!empty($attrs)) $attrs=$this->TransAttrs($attrs); if(!method_exists($this,$name)){ if(method_exists(self::$class,$name)){ eval('$res=self::$class->'.$name.'('.$attrs.');'); }else{ trigger_error("Метод $name не существует",E_USER_ERROR); } }else eval('$res=$this->'.$name.'('.$attrs.');'); return $res; } function __construct ($cnf,$driver='native'){ $obj=false; $class="TPL_Driver_".$driver; if(class_exists($class)){ self::$class=new $class; $this->cnf=$cnf; }else{ trigger_error("Драйвер '$class' не существует",E_USER_ERROR); } } private function TransAttrs($attrs){ $res=array(); for($i=0,$c=count($attrs);$i<$c;$i++){ if(!is_array($attrs[$i])){ $res[]="'".addslashes($attrs[$i])."'"; }else{ $res[]=var_export($attrs[$i],1); } } return implode(",",$res); } } ?>
http://ru.wikipedia.org/wiki/Фабричный_метод_(шаблон_проектирования) Читать. Потом бежать, покупать Фаулера. )
ой, что-то у меня голова совсем не варит сегодня, вот ещё из другой оперы PHP: <? class Main extends Factory{ static $class=false; function __constrcut(){ self::$class=parent::Load(); } function MyName(){ print "Im part of Main class methods<br>"; } } class Factory { static function Load(){ return new Driver(); } } class Driver { function GetName(){ print "Good Job!"; } } $c=new Main(); $c->MyName(); // $c->GetName(); // Как Сделать? ?> обратится из Main к методу драйвера GetName
Вот так: PHP: Main::$class->GetName(); Но, я так понимаю, ты не это хотел реализовать... Какая задача стояла изначально?
Cron =)) так то понятно что можно а мне надо включить функционал драйвера в класс Main короче чтобы можно было так Сделал я это с помощью eval'а, похожим образом как в коде в первом посте Пс. Прошу заметить это уже не касается шаблонизатора, просто схожая проблема но в другой части системы
Mr.M.I.T. Ты просыпайся давай: фабрика - это фабрика. Содержит загрузчик драйверов и, возможно, некоторый общий функционал. У нее должен быть только один публичный метод: создать драйвер. Все.
AlexGousev да это не фабрика, с шаблонизатором я разобрался короче этот класс, это обёртка НАД DBSimple Factory фабрика DBSimple, Driver это её драйвер, например MySql
Mr.M.I.T. А похоже на фабрику. И то, что она фабрика драйверов БД не делает ее принципиально отличной от фабрики шаблонов ;-)
AlexGousev это ясно, но посмотри фабрика это Factory, она вернёт класс драйвера теперь мне нужно включить функционал класса драйвера в класс Main и при этом сохранить функционал класса Main, своего рода наследование Короче, без евала никак?
[vs] так и сделал, пока, не нравится мне AlexGousev Обёртку над ДБСимпле, класс main будет включать в себя всякие методы упрощающие работу с ДБСимпле при этом мне надо иметь возможность обращатся к методам драйвера ДБСимпле, так же как к методам класса Main, иными словами мне нужно унаследовать класс-драйвер который возвращает Фабрика ДБСимпле
AlexGousev мм нет, думаю нет, как это нехорошо чтоли будет?.. лучше уж перезагрузка да и тем более, впринципе, в евале нет ничего плохого =)