Autor Zpráva
willy
Profil *
Dobrý den, jak udělám statickou metodu u abstraktní třídy v PHP 5.3? Na internetu jsem četl, že se k tomu používá Late Static Binding, ale s ním si nevím rady.
Nox
Profil
Nemusí jít nutně o abstraktní, ale obecně u dědění

Nejde o vytváření (to je stejné), ale přístup ... self:: se myslí vždy ta stejná třída, pokud dáš static::, tak se to vyhodnotí podobně jako u instančního přístupu (jak běžně člověk zamýšlí)
willy
Profil *
Moc děkuji. Jak se dá vyřešit tento problém?

<?php

abstract class Trida1
{
    abstract public static function metoda();
}


class Trida2 extends Trida1
{

    public static function metoda()
    {
        echo 'ahoj!';
    }
}

?>

Chyba: Strict Standards: Static function Trida1::metoda() should not be abstract
Bertram
Profil
willy:
Ahoj, statické vlastnosti a metody se vážou k třídě, jaký máš důvod, aby byla statická metoda abstraktní?
willy
Profil *
Omluvte mě, pokud jsem špatně pochopil abstraktní třídy, ale myslel jsem, že budu moci volat metody takovýmto způsobem: Trida1::metoda();.
Bertram
Profil
willy:
To by samozřejmě šlo, pokud by ta metoda nebyla abstraktní.
Edit: jde ale o vlastnost statických metod, nikoli abstraktních tříd
willy
Profil *
Má to nějaké nevýhody, pokud nebudu mít Třídu1 abstraktní? Rád bych používal statické metody.
Nox
Profil
willy:
Myslim, že by to nešlo nikdy - to přece ale nedává smysl, pokud tam není překlep 1 <=> 2

Co by se mělo pro Trida1::metoda() volat? Trida2::metoda()? A co když jich bude dědit víc... jak se to rozhodne...a i tak to stejně vůbec nedává smysl (proč by se volala metoda nějaké dědící třídy), ani kdyby to nebylo statické

O co se konkrétně pokoušíš?
Bertram
Profil
willy:
Pokud jsi chtěl vytvářet abstraktního předka, jen kvůli možnosti volat metody staticky, tak to nedělej. Abstraktní třídy slouží k jinému účelu.
willy
Profil *
Chtěl jsem vytvořit skript na tvorbu grafů, který by jsem volal přes abstraktní třídu a myslel jsem si, že bych použil různé extenze (pro různé typy grafů), které by dědily abstraktní třídu. Navíc jsem chtěl aby jsem mohl metody volat staticky, abych nemusel pokaždé vytvářet instanci. Nevím ale jestli jsem pochopil správně význam abstraktní třídy, takže se omlouvám pokud píšu nesmysly.
Nox
Profil
To by asi šlo, ale pokud máš abstraktní třídu, tak ji nepoužíváš, ani nemůžeš - používáš toho, kdo dědil.

Každopádně se můžeš mrknout i na kompozici, strategy pattern atd.

A tady máš navíc poměrně gigantický seriál diskusí :)

http://php.vrana.cz/prace-s-vlastnostmi-pomoci-metod.php
http://www.phpguru.cz/clanky/jak-na-praci-s-obrazky
http://php.vrana.cz/muze-mit-trida-image-metodu-resize.php
http://blog.renestein.net/O+Scaronpatně+Chaacutepaneacutem+Principu+Jedneacute+Odpovědnosti+Třiacutedy+SRP+A+O+Zneužiacutevaacuteniacute+Myscaronlenek+Domain+Driven+Designu+DDD.aspx (imho extrémně poučné)
willy
Profil *
Mockrát Vám děkuji.

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:

0