Autor Zpráva
sniclman
Profil
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();
.....
potřeboval bych aby mě $pageLoader->load(); naincludovalo do main.php soubor cacheload.php ve kterém jsou generovány funkce $fn->nějakáfunkce(atd...);

Nicméně pokud udělám následující:
pageLoader{

public function load(){
return include 'cacheload.php';
}

}
soubor cacheload.php se includuje v souboru s class, v tomto případě v souboru pageLoader.php. Problém je že pageLoader.php není definována proměnná $fn takže mě to akorát vyhodí error.
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...); ');
}

}
Notice: Undefined variable: fn ......
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();
tohle funguje, nicméně se mi tento zápis příliš nelíbí a pro budoucí update souborů s class to není výhodné.

Děkuji předem za vekšeré rady, snad jsem problém popsal dost podrobně :-)
Martin2
Profil *
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 *
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
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');
to není problém.

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 *
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: