Autor | Zpráva | ||
---|---|---|---|
tester Profil * |
Opravuji v projektu několik věcí, které jsem v minulosti udělal např. že jsem v souboru se třídou vytvořil instanci (problém vznikl s tím že jsem pak hledal kde se ta instance vytváří). Mám soubor include_classes.php a v něm by se měly includovat všechny třídy, jenže jsem v tom načítal i soubory, které už prováděly nějaké akce. Tak to jsem změnil a přesunul do init.inc.php kde se teprve ty iniciační akce vytváří včetně vytváření nových objektů. Co mi ale vadí že ty soubory, které jsem už includoval v include_classes.php, pak po mě v tom init křičely, že nemají nadefinované funkce. Nepomohlo přidat tam include toho include_classes.php, musel jsem tam zkopírovat ty samé include řádky které jsou v include_classes.php. Tohle moc nechápu jak je to možné. Ono to sice jede, ale proč to člověk musí includovat dvakrát? Používám na to include_once().
Ještě jeden dotaz dá se definice funkce nebo třídy podmínit? Například aby se definice funkce zavedla jen při spuštění z určitého souboru? Stejný problém je i s proměnnými. hlavní script je reg.php tam includuju ty třídy a ve třídě language se nadefinuje pole $lan pak v reg.php dám výpis pole a vidím že všechny hodnoty tam jsou. V reg.php dále includuju init.inc.php a v něm už tato proměnná přístupná není. |
||
Kajman Profil |
#2 · Zasláno: 18. 3. 2016, 15:00:45
Mrkněte v php manuálu na autoload.
|
||
tester Profil * |
#3 · Zasláno: 18. 3. 2016, 20:59:52
Píše mi to chybu parse error, unexpected T_FUNCTION, expecting ')'
__autoload(function ($class_name) { if (!file_exists(C::PATH.'/classes/language_class.php') ) echo("<strong>Error loading Language class</strong> in language_class.php line 8."); else include_once C::PATH.'/classes/language_class.php'; }); zkoušel jsem to i s spl_autoload_register, to samé PHP 5.2 |
||
Tomáš123 Profil |
#4 · Zasláno: 18. 3. 2016, 21:11:13
tester:
Tak si ju prečítaj a oprav (je to kdesi na tom riadku). |
||
tester Profil * |
Ale jo funguje to. Chyba byla v jiném souboru. Dík.
Stejně to nechápu. Mohu uvnitř té definice includovat libovolný počet souborů? function __autoload($name) { if (!file_exists(C::PATH.'/classes/language_class.php') ) echo("<strong>Error loading Language class</strong> in language_class.php line 8."); else include_once C::PATH.'/classes/language_class.php'; if (!file_exists(C::PATH.'/classes/results_class.php') ) echo("<strong>Error loading results class</strong> in include_classes.php line 14."); else include_once C::PATH.'/classes/results_class.php'; if (!file_exists(C::PATH.'/classes/SQL_class.php') ) echo("<strong>Error loading SQL class</strong> in include_classes.php line 19."); else include_once C::PATH.'/classes/SQL_class.php'; if (!file_exists(C::PATH.'/classes/const_class.php') ) echo("<strong>Error loading Const class</strong> in include_classes.php line 24."); else include_once C::PATH.'/classes/const_class.php'; /* if ($a=='v' && !file_exists(C::PATH.'/classes/view_class.php') ) echo("<strong>Error loading View class</strong> in include_classes.php line 29."); else include_once C::PATH.'/classes/view_class.php'; include_once C::PATH.'/classes/cachequery.class.php'; include_once C::PATH.'/classes/data.class.php'; include_once C::PATH."/classes/utilities.class.php"; } Aplikace jede, ale když pak v tom init.inc.php chci zrušit ty podruhé includované soubory tak mi to zase dává ty stejné hlášky jako před tím jak kdyby tam ten autoload nebyl. __autoload($name); // zkusím přídat include_once C::PATH.'/classes/mysql.class.php'; include_once C::PATH.'/classes/data.class.php'; include_once C::PATH.'/classes/cachequery.class.php'; include_once C::PATH.'/include/translate.inc.php'; include_once C::PATH.'/classes/results_class.php'; Takže odeberu např. mysql.class.php a hned to hoří |
||
tester Profil * |
#6 · Zasláno: 18. 3. 2016, 23:49:55
Tak nakonec je to funkční, chyba byla že jsem mysql.inc.php neměl uvedený v té funkci. Takže se mi to zkrátilo.
|
||
Martin2 Profil * |
#7 · Zasláno: 19. 3. 2016, 01:44:02
tester:
„Stejně to nechápu. Mohu uvnitř té definice includovat libovolný počet souborů?“ Nepřipadá ti divné, že parametr $name nikde nepoužíváš? Autoloading načítá objekty automaticky – při prvním použití.
Já vím, já vím. Užíváš nekonvenční styly v programování. Ale opravdu by ti prospělo věnovat aspoň trochu času studiu základů místo tohoto prasení. |
||
tester Profil * |
#8 · Zasláno: 19. 3. 2016, 08:14:27
Martin2:
Parametr $name je povinný, manuál jsem četl. Jede to. Víc neřeším. |
||
Zechy Profil |
#9 · Zasláno: 19. 3. 2016, 11:34:44
tester:
Ano, parametr je povinný, protože dostaneš název třídy, kterou aktuálně autoload načítá, tím pádem celá ta funkce může vypadat takhle: function __autoload($name) { if(file_exists(C::PATH.'/classes/'.$name.'.php')) { include_once C::PATH.'/classes/'.$name.'.php'; } else if(file_exists(C::PATH.'/include/'.$name.'.php')) { include_once C::PATH.'/include/'.$name.'.php'; } else { echo "Třídu ". $name ." se nepodařilo najít."; } } Což i na údržbu je o dost jednodušší přidat pět složek než přidávat postupně 500 souborů. |
||
tester Profil * |
#10 · Zasláno: 19. 3. 2016, 12:02:02
Zechy:
Aha, to se hodí. Tím se mi opět zkrátí kód :-) |
||
Časová prodleva: 9 let
|
0