Autor | Zpráva | ||
---|---|---|---|
_fantomas Profil |
#1 · Zasláno: 31. 1. 2015, 11:23:05
Ahoj, mám problém s viacnásobným volaním jednej triedy.
Príklad: Mam napríklad triedu test.php a test1.php V oboch triedach includujem dalšiu triedu mysql.php a ak v index.php includnem test.php a test1.php vypíše error že volám viackrát triedu mysql. čo je logicke lebo ju volam aj v test.php a test1.php Nedá sa to volajako obísť? Pretože mam login.php v ktorom volám mysql tam tu triedu používam a potom mam dalšiu triedu user.php a tam tiež pracujem s mysql takže zas musím volat mysql triedu ... |
||
Radek9 Profil |
#2 · Zasláno: 31. 1. 2015, 11:25:29
_fantomas:
Společně s konstrukcemi include a require existují i konstrukce include_once a require_once , které řeší tvůj problém.
|
||
_fantomas Profil |
#3 · Zasláno: 31. 1. 2015, 11:31:52
Ja som tu funkciu poznal len som nikdy nevedel čo je to once .. Dik, funguje. a možeš mi to vysvetlit čo to vlastne robí a ako to funguje?
|
||
Fisir Profil |
#4 · Zasláno: 31. 1. 2015, 11:33:58
Reaguji na _fantomase:
RTFM. |
||
Alphard Profil |
#5 · Zasláno: 31. 1. 2015, 11:34:24
Radek9 [#2]:
Řeší, ale ne moc dobře. _fantomas [#1]: Viz php.net/manual/en/language.oop5.autoload.php. „ako to funguje“ Jednou načtenému souboru se nastaví (definuje) proměnná, že už byl načten a podruhé se přeskočí. Princip známý tak 50 let, tyhle funkce ho jen skrývají pod pokličku. |
||
_fantomas Profil |
#6 · Zasláno: 31. 1. 2015, 12:39:38
Trichu nechápem ako funguje __autoload ... kde ho mam presne dávat? Do každej triedy?
|
||
xROAL Profil |
#7 · Zasláno: 31. 1. 2015, 13:17:17
Autoload je funkcia, ktorá sa sama spustí keď sa pokúsiš vytvoriť objekt z triedy, ktorú PHP (v danom behu scriptu) nepozná, resp. nebola ešte definovaná.
Predpokladám, že do súboru index.php includuješ triedy a následne s nimi v tomto súbore pracuješ, v takom prípade tvoj __autoload bude niekde na začiatku (predtým, než začínaš vytvárať objekty) v index.php . Potom už nemusíš riešiť žiadny include , ak napíšeš $objekt = new MojaTrieda(); , PHP spustí funkciu __autoload a ako parameter jej predá string "MojaTrieda" , následne by sa už táto funkcia __autoload mala postarať o include súboru s touto triedou.
|
||
_fantomas Profil |
#8 · Zasláno: 31. 1. 2015, 14:26:07
aj bez toho aby vedela aky nazov ma subor s triedou "MojaTrieda"?
|
||
Radek9 Profil |
#9 · Zasláno: 31. 1. 2015, 14:40:15
_fantomas:
Předpokládá se, že soubor s třídou „MojeTrieda“ se bude jmenovat MojeTrieda.php |
||
Alphard Profil |
#10 · Zasláno: 31. 1. 2015, 15:07:39
Radek9 [#9]:
Ne nutně. Jsou na to různé názory, někdo tvrdí, že by se namespaces měly shodovat s adresářovou strukturou, viz PSR-0 (je tam i příklad, jak napsat autoloader funkci). Na druhou stranu je možné uložit a pojmenovat si soubory se třídami libovolně (klidně dát i více tříd do jednoho souboru) a pro jejich nalezení si vytvořit index. Já třeba často využívám api.nette.org/2.2.7/Nette.Loaders.RobotLoader.html, princip je takový, že se automaticky projdou všechny sledované adresáře, naparsují se přítomné třídy a při požadavku na některou z nich je v cache cesta k souboru, kde ji lze najít. |
||
Časová prodleva: 9 let
|
0