Autor Zpráva
obi
Profil *
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
Nejde to..
Nox
Profil
jsim, obi
podle rootu ano (a podle data už asi dost dlouho)

http://www.root.cz/clanky/zaostreno-na-php-3
AM_
Profil
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 *
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
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
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;
  }
}
Krásným existujícím příkladem může být třída Nette\String. Otázkou pak je, jestli by taková třída něměla být nahrazena jmenným prostorem.
Aichi
Profil
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
[#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
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
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
Změnit viditelnost lze, ale pouze ve směru ze skrytých na viditelné, takže private > protected > public.
Mimochodem, v [#6][#7] stačí přidat final.
AM_
Profil
[#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.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0