Jojo, PHP4 v zadnym pripade neni OOP, staci se jenom podivat na nemoznost rozliseni jestli promenna obsahuje objekt nebo referenci na objekt. A takovych veci je vic, ale prej PHP5 uz bude hodne lepsi na objekty, tak uvidime.
Ke skryvani promennych: ani by to nebylo moc super, protoze PHP (v4) jaksi nedokaze udelat $objekt->metoda1()->metoda2(), takze je nutne bud pouzit X promennych na docasne ulozeni objektu vracenych metodou1 a nebo, pokud metoda1 vraci objekt, ktery je nejakym zpusobem ulozeny v objektu $objekt, tak pristupovat primo na tu promennou. Az bude PHP umet tohle, tak muze skryvat promenne.
Jinak PHP ma rekl bych hodne bugu v docela zakladnich akcich, problem je, ze pro male skriptiky se asi moc neprojevi. Mam napriklad nasledujici kod
=====
class A {
var $ch=array();
function __construct() {
}
function A() {
$this->__construct();
}
}
class B extends A {
function B() {
echo gettype($this->ch);
parent::__construct();
}
}
$b=&new B();
=====
samozrejme takhle napsanej skriptik vypise typ "array()". V nasem programu (takovy trosku vetsi projekt) mi to normalne taky nechava v promenne $ch array, ale v urcitym pripade mi to tam nastavi kdo vi co a je tam "unknown type" (var_dump rika "&UNKNOWN:0"). Pritom kdyz do tridu A upravim takhle
===
class A {
var $ch=array();
function __construct() {
$this->ch=1;
echo "trida A";
}
}
===
tak se mi uz v konstruktoru B() vypise "array()" a pak se vypise text "trida A", cili staci pridat pouze kod na prirazeni do promenne a uz to uvlivni, ze pri vytvareni objektu (PHPckem) se vlozi spravne array do promenne $ch (ktery je pak samozrejme prepsan cislem 1). Proste docela takovej bordel.
Výraz array() není funkce, ale jazykový konstrukt, jak se píše v dokumentaci, tudíž i tato námitka je trochu diskutabilní. Teoreticky by to tedy měl být skutečně konstantní výraz.
Já si spíš myslím, že prostě je PHP trochu nedomyšlené, a mnohdy ani PHP neví, kam co patří.
On totiž samotný PHP jazyk se mnohdy skutečně chová dost překvapivě. Sám jsem toho v PHP napsal hodně, a leckdy využívám věci z PHP až do vyždímání z poslední kapky. A leckdy chování PHP odhaduji stylem: "Kdybych byl autor PHP, tak bych asi tuto funkci napsal v C takto. A chovalo by se to asi takto." Tedy odhaduji vnitřní algoritmy.
Osobně považuji za nejlepší strategii nevyužívat PHP naplno. A vyzkoušení je k ničemu, protože to pak v jiné verzi PHP často funguje trochu odlišně.
Ach jo. Uz zase nekdo misinterpretuje zapouzdreni (a nejspise nejen to)...lidi, ten termin je preci o necem uplne jinem nez "private" a "public." Ostatne PHP neni samo, zadny jazyk, ktery podporuje "public" promenne (treba C++ nebo Java) nezapoudruje tak, jak by podle OOP mel (samozrejme z duvodu implementacni efektivity - to neznamena, ze jazyk je spatny - jen neni OO v tom nejprisnejsim slova smyslu)
V PHP typy objektů de facto neexistují. Prostě objekt je halda atributů a halda metod. A název třídy je de facto jen skrytý atribut.
Takže přetypování není potřeba. Prostě tam dosadíte objekt jiné třídy, který má potřebné atributy a metody, dokonce nemusí být ani v dědické linii. A bude to fungovat.
Mě se to sice nelíbí, ale takto to je. Na druhé straně je to dost flexibilní. Dokonce si můžete vytvářet dočasné třídy, aniž byste psal kód.