| 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: 10 let
|
|||
0