Autor | Zpráva | ||
---|---|---|---|
obi Profil * |
#1 · Zasláno: 21. 6. 2010, 18:37:20
ahoj,
na netu jsem v nějakém článku četl, že PHP 5 umí vnořené třídy. A pak jsem v jiném článku četl, že umí statické třídy :-) tak to tu teď zkouším a hází mi to "unexpected T_CLASS, expected T_FUNCTION" class A{ class B{ function mojeFunkce(){ echo "ahoj"; } } } A::B::mojeFunkce(); Nevíte jak tu strukturu tříd vytvořit, aby mi příkaz A::B::mojeFunkce(); fungoval? Moc děkuju |
||
jsim Profil |
#2 · Zasláno: 21. 6. 2010, 18:47:08
Nejde to..
|
||
Nox Profil |
#3 · Zasláno: 21. 6. 2010, 18:50:47
jsim, obi
podle rootu ano (a podle data už asi dost dlouho) http://www.root.cz/clanky/zaostreno-na-php-3 |
||
AM_ Profil |
#4 · Zasláno: 21. 6. 2010, 18:50:59
PHP neumí ani vnořené, ani statické třídy.
- můžeš ale třídě všechny metody a atributy nastavit jako "static" a pak je de facto statická - místo vnořování tříd můžeš od PHP5.3 používat namespace |
||
obi Profil * |
#5 · Zasláno: 21. 6. 2010, 21:55:25
vypadá to, že tady jsou rozdílné názory... že by na rootu psali něco, co ve skutečnosti není pravda?
Jdu si pročíst ty tři díly toho seriálu... |
||
AM_ Profil |
#6 · Zasláno: 21. 6. 2010, 22:14:47
o statických třídách mám pravdu a o těch se nezmiňuje ani ten článek..
o vnořené třídy se evidentně pokusilo zend jádro PHP3 (viz ten článek), ale dnes to evidentně nefunguje (pokus deklarovat class A::B skončí krásnou hebrejskou chybou "unexpected T_PAAMAYIM_NEKUDOTAYIM"). Správně je opravdu použít jmenné prostory. Jinak co se týče ukázky v [#1] obi, statické metody se deklarují s klíčovým slůvkem "static" (public static function ...) |
||
Majkl578 Profil |
#7 · Zasláno: 22. 6. 2010, 01:59:04
Na statickou třídu si v PHP jde pouze hrát, třeba takto:
class Foo { public function __construct() { throw new \LogicException("Cannot instantiate static class " . get_class($this)); } public static function bar() { return 1; } } |
||
Aichi Profil |
#8 · Zasláno: 22. 6. 2010, 09:15:53
Jestli je třída "statická", pak by ten konstruktor měl být private, pak by nebyla třeba takováto opičárna s vyjímkou.
|
||
AM_ Profil |
#9 · Zasláno: 22. 6. 2010, 10:54:38
[#8] Aichi
mě zase přijde lepší, když to pak vyhodí jednoznačné "Cannot instantiate static class Foo" než prapodivnou hlášku "Fatal error: Call to private Foo::__construct() from invalid context", to bych si asi nejdřív řekl, že ten co to napsal byl slabý na hlavu, že psal konstruktor private, a při delším přezkoumání bych přišel na to, jak je to myšleno. |
||
Aichi Profil |
#10 · Zasláno: 22. 6. 2010, 13:58:44 · Upravil/a: Aichi
AM:
Pokud tvojí třídu podědím, přepíšu konstruktor, pak dělám vesele instance. Pokud podědíš moji, tak z private, public neuděláš. Hláška je naprosto výmluvná, voláš neco co je privátního. |
||
AM_ Profil |
#11 · Zasláno: 22. 6. 2010, 14:10:38
class A{ private function __construct() { restart_universe(); } } class B extends A{ public function __construct() { echo "Aichi nema pravdu"; } } $x = new B(); zkus si to pustit... |
||
Majkl578 Profil |
#12 · Zasláno: 22. 6. 2010, 15:54:32 · Upravil/a: Majkl578
|
||
AM_ Profil |
#13 · Zasláno: 22. 6. 2010, 16:05:01
[#12] Majkl578
ano, druhým směrem to samozřejmě nejde, "schovat" metodu, která v parent třídě existovala, je proti principům OOP. Šlo o to, že Aichi neměl pravdu v tom, že viditelnost konstruktoru zabrání jeho přepsání. Jak říkáš ty, to se dělá final. |
||
Časová prodleva: 14 let
|
0