Autor Zpráva
Timy
Profil
Mám třídu, ve které volám metodu jiné třídy pomocí dvojité dvojtečky. Asi nějak takhle:


class trida
{
function funkce()
{
druhaTrida::metoda();
}
}


A dejme tomu, že ta metoda v druhé třídě vypadá takhle:


class druhaTrida
{
public $var="ahoj";

function metoda()
{
$this->druhaMetoda();
}

function druhaMetoda()
{
echo $this->ahoj;
}
}


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

{

function funkce()
{
druhaTrida::metoda();
}
}


class druhaTrida
{
function metoda()
{
echo "jde to";
}
}

trida::funkce();
ah01
Profil
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
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í ->.
Toto téma je uzamčeno. Odpověď nelze zaslat.