Autor | Zpráva | ||
---|---|---|---|
Timy Profil |
#1 · Zasláno: 16. 5. 2007, 15:48:58
Mám třídu, ve které volám metodu jiné třídy pomocí dvojité dvojtečky. Asi nějak takhle:
A dejme tomu, že ta metoda v druhé třídě vypadá takhle:
Když teď třeba zavolám Trida::funkce();, nebude to moc fungovat, nemůžu se odkazovat přes $this, když tu metodu spouštím v jiném objektu. Musím to teda přepsat na self:: a tu druhou metodu deklarovat jako statickou. To samé ovšem s tou proměnnou. Takže otázka - bude lepší, když v tom druhém objektu přidám prakticky ke všemu klíčové slovo static nebo mám ty metody v druhém objektu přehodit do prvního objektu? Nebo je nějaká ještě jiná možnost? Měl jsem vizi, že budu mít jednu třídu, která se bude starat o chod ostatních tříd, bude rozhodovat, co se bude dělat na základě podnětů z vnějšku (URL, poslanné proměnné apod.) a bude prostě jednoduše spouštět metody ostatních tříd. U blogu například Clanky::vypisClanky(); nebo Administrace::zobrazAdministraci();. Jenomže to by znamenalo, že všechny metody a proměnné v ostatních třídách než v té řídící by musely být statické. Což se mi nějak nezdá... Můžu taky udělat prostě jednu třídu pro administraci a jednu pro chod blogu (to, co uvidí čtenář). Takže jak by to asi mělo vypadat? |
||
ah01 Profil |
#2 · Zasláno: 16. 5. 2007, 16:12:08
Volání pomocí „::“ je volání statické metody. Takže pokud to chceš takto používat, musí to být statické metody. Nebylo by ale vhodnější vytvořit si instanci třídy administrace a volat metody jako instanční?
|
||
Timy Profil |
#3 · Zasláno: 16. 5. 2007, 16:29:59
ah01
Aha, jak jednoduché. Takže vytváření instancí uvnitř třídy je v pohodě, to mi nějak nedošlo, myslel jsem, že to nejde. Měl bych míň myslet a víc zkoušet :-). Díky. "Volání pomocí „::“ je volání statické metody. Takže pokud to chceš takto používat, musí to být statické metody." Určitě musí být statická? Třeba tohle funguje a přitom tam nic statického nemám: class trida |
||
ah01 Profil |
#4 · Zasláno: 16. 5. 2007, 16:59:52 · Upravil/a: ah01
Timy
No přiznám se, že mé OOP znalosti vychází spíš z Javy (kde by něco takového neprošlo kompilátorem). V PHP5 jsem nikdy takové drobnosti nezkoumal, ale možná, že pokud nikde nepoužíváš $this tak tě to nechá zavolat metodu i jako statickou, přestože není deklarovaná jako statická. Každopádně bych v takovém případě to „static“ radši uvedl. Volat metody jako statické i instanční se mi moc nelíbí, i když třeba se to někdy hodí… |
||
MzM Profil |
#5 · Zasláno: 17. 5. 2007, 10:27:27
Ono objekty jsou primárně na to aby se z nich dělaly ty instance. Takže většina metod se volá jako metody nějaké proměnné typu třída. Nic méně jsou případy, kdy se používají i statické metody. Typický příklad jsou objekty, které převádějí jeden typ na druhý (string na int - to je sice v php divný příklad nic méně je to příklad). Zkusím dát příklady:
- volání dynamických metod $db = new db('db', 'jm', 'heslo'); if ($db->query('select * from tab')) { $db->fetch(); ... } tady volat např metodu query() asi nemá smysl, je třeba vytvořit spojení, případně ověřit, jestli je ok a pod. - volání statické metody $narodni_datum = datum::toString('20070517', 'cz'); kde nechci mít přímo vytvořenou proměnnou typu datum, ale použiju statickou metodu, která umí převést to 20070517 např na něco typu '17. 5. 2007' Vzhledem k tomu, že je PHP interpretovaný, jsou v podstatě všechny metody statické (interpreter se k nim dostane i když ze tříd nejsou vytvořené instance). Ještě tady čtu, že static proměnné třídy se nedají zpřístupňovat pomocí ->. |
||
Časová prodleva: 17 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0