Autor | Zpráva | ||
---|---|---|---|
sniclman Profil |
#1 · Zasláno: 25. 2. 2016, 00:54:27
Zdravím,
můžete mi prosím poradit jak z objektové funkce vrátit funkci eval nebo funkci include? Mám soubor main.php ve kterém přes auloader načítám classy ..... $fn = new functions(); $images = new images(__ROOT__, __SITE_ROOT__, 'cache'); $pageLoader = new pageLoader(__ROOT__, 'pages', 'cache'); $pageLoader->load(); ..... Nicméně pokud udělám následující: pageLoader{ public function load(){ return include 'cacheload.php'; } } Notice: Undefined variable: fn ...... Fatal error: Call to a member function nějakáfunkce() Zkoušel jsem ještě něco na tento způsob ale s výsledkem error: pageLoader{ public function load(){ return eval('$fn->nějakáfunkce(atd...); '); } } Fatal error: Call to a member function nějakáfunkce() soubor cacheload.php nebo proměnné v eval jsou generovány dynamicky. Pro upřesnění, class pageLoader prohledává složku se soubory, bere z nich určité parametry a následně vrací cesty k souborům které se mají načíst. ještě jsem zkoušel například tohle: $pageLoader = new pageLoader(__ROOT__, 'pages', 'cache'); eval($pageLoader->load()); nebo include $pageLoader->load(); Děkuji předem za vekšeré rady, snad jsem problém popsal dost podrobně :-) |
||
Martin2 Profil * |
#2 · Zasláno: 25. 2. 2016, 06:42:16
Vymýšlíš nějakou hroznou zběsilost, bez bližšího náhledu do kódu těžko soudit jakou.
Pro autoloading tříd se většinou používá funkce __autoload. Automatickou tvorbu objektů, by měla ve slušném návrhu zajišťovat tzv. Factory. Obecně bych ti ještě poradil, abys nikdy nepoužíval konstrukt eval a nikdy nevytvářel vlastní __KONSTANTY__ .
|
||
sniclman Profil |
Proč bych nikdy neměl vytvářet vlastní konstanty?
soubor class.php define('__ROOT__', dirname(__FILE__).'/'); define('__SITE_ROOT__', str_replace(str_replace('_','www',dirname($_SERVER['SCRIPT_FILENAME'])), '', __ROOT__)); spl_autoload_register(function($class){ $path = dirname(__FILE__).'/'.'class/'; $file = $path.$class.'.php'; if(is_file($file)){include $file;} else{ register_shutdown_function(function($class){echo 'Can not load class '.$class;},$class); eval('class '.$class.'{}'); new $class();} }); soubor main.php include_once 'class.php'; $fn = new functions(); $images = new images(__ROOT__, __SITE_ROOT__, 'cache'); $asyncScripts = new asyncScripts(__ROOT__, __SITE_ROOT__); $lang = new language('cs', 'en'); $pageLoader = new pageLoader(__ROOT__, 'pages', 'cache'); pageLoader získá array (vše je string, přečteno přes fopen) parametrů ze souborů, které by se měly načíst podle url [0] => Array ( [path] => /hosting/www/example.xxx/package/pages/contact/contact.php [last_update] => 1456306501 [url] => $lang->set('url.link.contact') [title] => $lang->set('contact.main.title') ) [1] => Array ( [path] => /hosting/www/example.xxx/package/pages/contact/contactForm.php [last_update] => 1456350556 [url] => $lang->set('url.link.contactform') [title] => $lang->set('contact.main.title') ) [2] => Array ( [path] => /hosting/www/example.xxx/package/pages/homepage/homepage.php [last_update] => 1456306815 [url] => $lang->set('url.link.homepage') ) Jde o to že potřebuju správně spustit $lang->set('url.link.contact') tak aby mě vrátil správnou jazykovou mutaci. Např kontakt nebo contact atd. Tady je jpůvodní způsob definice načtení stránky soubor main.php $fn->setPage($lang->set('url.link.homepage'), 'homepage/homepage.php'); $fn->setPage($lang->set('url.link.bbb'), 'aaa/bbb.php'); $fn->setPage($lang->set('url.link.ccc'), 'aaa/ccc.php'); |
||
Martin2 Profil * |
#4 · Zasláno: 25. 2. 2016, 12:30:31
sniclman:
„Proč bych nikdy neměl vytvářet vlastní konstanty?“ Vlastní konstanty klidně, vlastní __konstanty__ nikdy – ty používá PHP.
„Jde o to že potřebuju správně spustit $lang->set('url.link.contact') tak aby mě vrátil správnou jazykovou mutaci.“ Takže jde o předání parametru $lang do třídy pageLoader ?
Tohle řeší Dependency injection – předej parametr/závislost konstruktorem nebo nějakým setterem. |
||
sniclman Profil |
#5 · Zasláno: 25. 2. 2016, 15:01:47
Martin2:
Konstatny ok. Změním, děkuji za vysvětlení. Přesně tak, potřebuji předat parametr $lang do třídy pageloader. V page loaderu potřebuji vygenerovat něco takového: $this->setPage($lang->set('url.link.bbb'), 'aaa/bbb.php'); $this->setPage($lang->set('url.link.ccc'), 'aaa/ccc.php'); V main.php jsem chtěl udělat něco takového: $pageLoader = new pageLoader(__ROOT__, 'pages', 'cache', $lang); Ale nevím jak nadefinovat potom v class pageLoader právě parametr $lang. Zkoušel jsem různé kombinace func_get_args, get_defined_vars atd. Chtěl bych mít class pageLoader variabilní. Aby stačilo pak v main případně zadat jenom: $pageLoader = new pageLoader(__ROOT__, 'pages', 'cache', $lang, $images, $fn, $atd...); Dependency injection - byl by nějaký hezký příklad použití, případně vysvětlení? Nejsem z toho moc chytrý. |
||
Martin2 Profil * |
#6 · Zasláno: 25. 2. 2016, 20:58:59
sniclman:
„Chtěl bych mít class pageLoader variabilní.“ Variabilní počet argumentů slušný programátor nepoužívá. Je to až na řídké výjimky prasečina. „Dependency injection - byl by nějaký hezký příklad použití, případně vysvětlení? Nejsem z toho moc chytrý.“ Google nic, Wiki nic? Není to raketová věda, nejjednodušší způsob DI jsem napsal – parametr z konstruktoru ( $lang ve tvém případě) si ulož jako privátní proměnnou třídy a můžeš ji pak uvnitř používat dle libosti.
|
||
Časová prodleva: 8 let
|
0