Autor | Zpráva | ||
---|---|---|---|
willy Profil * |
#1 · Zasláno: 10. 1. 2012, 18:01:15
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 |
#2 · Zasláno: 10. 1. 2012, 20:21:02
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 * |
#3 · Zasláno: 10. 1. 2012, 21:44:45
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 |
#4 · Zasláno: 10. 1. 2012, 22:15:33
willy:
Ahoj, statické vlastnosti a metody se vážou k třídě, jaký máš důvod, aby byla statická metoda abstraktní? |
||
willy Profil * |
#5 · Zasláno: 10. 1. 2012, 22:23:57
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 |
#6 · Zasláno: 10. 1. 2012, 22:27:33 · Upravil/a: Bertram
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 * |
#7 · Zasláno: 10. 1. 2012, 23:03:46
Má to nějaké nevýhody, pokud nebudu mít Třídu1 abstraktní? Rád bych používal statické metody.
|
||
Nox Profil |
#8 · Zasláno: 10. 1. 2012, 23:07:31 · Upravil/a: Nox
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 |
#9 · Zasláno: 10. 1. 2012, 23:17:19
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 * |
#10 · Zasláno: 12. 1. 2012, 21:50:17
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 |
#11 · Zasláno: 12. 1. 2012, 22:07:17
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 * |
#12 · Zasláno: 12. 1. 2012, 22:11:36
Mockrát Vám děkuji.
|
||
Časová prodleva: 12 let
|
0