Autor Zpráva
_fantomas
Profil
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
_fantomas:
Společně s konstrukcemi include a require existují i konstrukce include_once a require_once, které řeší tvůj problém.
_fantomas
Profil
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
Reaguji na _fantomase:
RTFM.
Alphard
Profil
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
Trichu nechápem ako funguje __autoload ... kde ho mam presne dávat? Do každej triedy?
xROAL
Profil
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
aj bez toho aby vedela aky nazov ma subor s triedou "MojaTrieda"?
Radek9
Profil
_fantomas:
Předpokládá se, že soubor s třídou „MojeTrieda“ se bude jmenovat MojeTrieda.php
Alphard
Profil
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.

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: