Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Na co si dát pozor při práci s objekty v PHP

Cílem tohoto článku je upozornit na některé nezvyklé vlastnosti práce s objekty v PHP, jejich důsledky a možná řešení.

Tweetni to Twitter Jaggni to! Jagg Del.icio.us Delicious

Uvedené skutečnosti vycházejí z práce s PHP verze 4.3.3.

Skrývání informací a implementace

Jedná se o jednu ze základních vlastností objektů. Ty mají být schopny navenek jednat prostřednictvím svého rozhraní a operace a atributy sloužící pouze jejich interní potřebě skrývat před okolím. PHP nedovoluje skrývat atributy a operace (private). V PHP jsou všechny atributy a operace veřejné! Možným řešením je využívat vlastních konvencí pro názvy operací a atributů, specifikaci zapsat do komentáře nebo použít dokumentační systém jako například Phpdocumentor. Phpdocumentor je obdoba Javadoc určená pro PHP. Dovoluje přiřadit operaci či atributu viditelnost. Pozor, údaje platí pouze pro dokumentaci, v rámci PHP je vše při starém.

Přiřazení

Přiřazení $objekt2=$objekt nepředá odkaz, ale hodnotu. PHP vlastně vytvoří nový objekt $objekt2 a do něj zkopíruje stav objektu $objekt. Nezbývá než používat konstrukce jako $objekt2=&$objekt, function &vratObjekt(), function (&$parametrOb­jekt) apod.

Identita objektu

Každý objekt má svůj vlastní jedinečný identifikátor (handle). Pro PHP je oním identifikátorem de facto název objektu (proměnné). V tomto ohledu PHP pracuje s objekty jako s primitivními typy. Ostatně jako při přiřazování. Chování PHP demonstruje následující ukázka.

Class A {
    var $a;
    function a() {
    $this->a=rand(0,100);
    }
    function getA() {
    return $this->a;
    }
}
$a=new A;
$b=&$a;
$a=new A;
echo $a->getA()."&#60br&#62";
echo $b->getA()."&#60br&#62";

Program vypíše vždy stejné hodnoty. Řešením je buď přiřadit hodnotu ($b=$a), nebo instanci třídy A podruhé nepojmenovat $a, ale zvolit jiné jméno. Uvedená vlastnost se nepříjemně projeví zejména při agregaci.

Class A {
    var $a;
    function a() {
    $this->a=rand(0,100);
    }
    function getA() {
    return $this->a;
    }
}

Class B {
    var $pole = array();
    function b() {
    for ($i=1;$i<=10;$i++) {
            $a=new A;
        array_push($this->pole,&$a);
        }
    }

    function nakresliB() {
    foreach ($this->pole as $a) {
    echo $a->getA()."&#60br&#62";
        }
    }
}

$b=new B;
$b->nakresliB();

Program vypíše stejné hodnoty. Nezbývá než vkládat do pole hodnoty místo odkazů, nebo nevytvářet při každém průchodu cyklu objekt s názvem $a, ale například objekt jako prvek pole $a, tedy $a[$i].

Délka života objektu

V PHP je životnost objektu spjata s během skriptu na webovém serveru. V praxi tedy objekt žije od kliknutí na odkaz uživatelem po zobrazení příslušné stránky na jeho prohlížeči. Naštěstí PHP umožňuje objekty serializovat a ukládat například do session proměnných. Tak můžeme pracovat s jedním objektem během celého sezení. Pro práci s objekty v rámci sezení lze využít následující konstrukce.

Nejdříve zjistíme, zda v session proměnné „a“ je příslušný objekt uložen. Pokud ne, vytvoří se nový, jinak se obnoví ze session proměnné.

if ($_SESSION['a']=="") {
        $a = new A;
} else {
        $a = $_SESSION['a'];

Na konci skriptu objekt $a uložíme zpět do session proměnné „a“.

$_SESSION['a']=$a;

PHP ukládá stav daného objektu i objektů, které jsou obsaženy v jeho proměnných nebo na které jeho proměnné ukazují. Je-li uložen objekt stádo skotu, který obsahuje pole krávy s prvky ukazujícími na jednotlivé objekty krav a pole býci, které obsahuje ve svých prvcích hodnoty objektů třídy býk, uloží se jak krávy, tak býci. Chování demonstruje následující příklad.

Class A {
    var $a;

    function a() {
    $this->a=rand(0,100);
    }

    function getA() {
    return $this->a;
    }
}

Class B {
    var $b;
    var $c;

    function b() {
        $a=new A;
    $this->b=$a;
    }

    function nakresliB() {
    echo $this->b->getA()."&#60br&#62";
    }

    function nakresliC() {
    echo "&#60br&#62".$this->c->getA()."&#60br&#62";
    }

    function setC(&$c) {
    $this->c=&$c;
    }
}

session_start();

if ($_SESSION['b']=="") {
    $b = new B;
    $c = new A;
    $b->setC($c);
} else {
    $b = $_SESSION['b'];
}
$b->nakresliB();
$b->nakresliC();
echo '&#60;br&#62;&#60;br&#62;&#60;a href="pokus.php"&#62;více&#60;/a&#62;';
$_SESSION['b']=$b;

Po každém kliknutí na odkaz „více“, který opět spustí uvedený skript pokus.php, se zobrazí stejný pár čísel.

Vícenásobná dědičnost

PHP nepodporuje vícenásobnou dědičnost ani nepovoluje vícenásobné dědění odpovědnosti, jako např. java pomocí „implements“.

Přetěžování

PHP nepodporuje přetěžování.

davame_internetu_obsah
       

Abstraktní třídy

PHP nezná pojem abstraktní třídy, ale umí přepisování. To dovoluje definovat „abstraktní“ třídu jako běžnou třídu a v potomcích operace přepsat a naplnit je požadovaným obsahem.

Závěr

PHP vyžaduje od programátora jistou dávku disciplíny, a to zejména při kooperaci více lidí v rámci projektu. Práce s objekty v PHP má svá specifika, na která je třeba si zvyknout, nicméně nejsou zde překážky, které by objektově orientovanou tvorbu vysloveně komplikovaly.

Školení: Linux – Firewall, Samba, VPN

Na třídenním školení se naučíte nainstalovat a spravovat Firewall a Router, SAMBA Doménový a Souborový server. Dále si zprovozníte vlastní, zabezpečený VPN server.

Podrobnější informace a přihláška

Ohodnoťte jako ve škole:
Průměrná známka 3,15

Přehled názorů

oop
luda 9. 10. 2003 00:16
Nový
├ 
Re: oop
luda 9. 10. 2003 00:20
Nový
│
└ 
Re: oop
RWS 9. 10. 2003 09:05
Nový
│
 
└ 
Re: oop
Jirka Reznicek 10. 10. 2003 20:15
Nový
│
 
 
└ 
Já bych se zastal
Miloslav Ponkrác 10. 10. 2003 20:25
Nový
├ 
Re: oop
Jakub Hegenbart 9. 10. 2003 14:27
Nový
└ 
Re: oop
Roman Pichlík 10. 10. 2003 08:49
Nový
 
└ 
Typy třídy
Miloslav Ponkrác 10. 10. 2003 20:30
Nový
session
Tomas 9. 10. 2003 00:35
Nový
├ 
Re: session
RWS 9. 10. 2003 09:18
Nový
│
└ 
PHP
Piškot 9. 10. 2003 11:48
Nový
└ 
Re: session
Miroslav Holy 9. 10. 2003 10:18
Nový
ja nevim
Marek Slapak 9. 10. 2003 12:27
Nový
└ 
Re: ja nevim
barney 9. 10. 2003 13:23
Nový
 
├ 
Re: já tedy asi také nevím...
Yeti 9. 10. 2003 14:45
Nový
 
│
└ 
Re: já tedy asi také nevím...
Michal Kara 9. 10. 2003 14:56
Nový
 
├ 
Perl?
agent 9. 10. 2003 16:11
Nový
 
│
├ 
Re: Perl?
barney 10. 10. 2003 09:39
Nový
 
│
└ 
Re: Perl?
agent 10. 10. 2003 14:34
Nový
 
│
 
└ 
Re: Perl?
David Graf 10. 10. 2003 17:12
Nový
 
└ 
Re: ja nevim
Marek Slapak 10. 10. 2003 12:30
Nový
 
 
├ 
Re: ja nevim
barney 10. 10. 2003 13:03
Nový
 
 
│
├ 
Re: ja nevim
Marek Slapak 13. 10. 2003 15:08
Nový
 
 
│
│
└ 
Re: ja nevim
barney 15. 10. 2003 11:01
Nový
 
 
│
├ 
Re: ja nevim
Jirka Hradil 13. 10. 2003 16:04
Nový
 
 
│
│
└ 
Re: ja nevim
barney 15. 10. 2003 11:01
Nový
 
 
│
│
 
└ 
Re: ja nevim
Jirka Hradil 17. 10. 2003 14:17
Nový
 
 
│
│
 
 
└ 
Re: ja nevim
anonymní uživatel 16. 5. 2005 10:10
Nový
 
 
│
└ 
Re: ja nevim
Jakub Hegenbart 13. 10. 2003 16:51
Nový
 
 
└ 
Re: ja nevim
jezovec 10. 10. 2003 16:18
Nový
Pružnost PHP
Rob 9. 10. 2003 12:30
Nový
└ 
Re: Pružnost PHP
Petycz 9. 10. 2003 14:21
Nový
 
├ 
Re: Pružnost PHP
Michal Kara 9. 10. 2003 14:56
Nový
 
│
├ 
Re: Pružnost PHP
Marek Slapak 10. 10. 2003 12:31
Nový
 
│
└ 
Re: Pružnost PHP
dond 13. 10. 2003 12:58
Nový
 
└ 
Re: Pružnost PHP
hkmaly 9. 10. 2003 20:32
Nový
 
 
└ 
Re: Pružnost PHP
Marek Slapak 10. 10. 2003 13:24
Nový
 
 
 
└ 
Re: Pružnost PHP
Jakub Hegenbart 13. 10. 2003 16:57
Nový
Identita objektu
CHe 9. 10. 2003 16:12
Nový
└ 
Re: Identita objektu
hkmaly 9. 10. 2003 20:32
Nový
Prirazeni
Jirka Reznicek 10. 10. 2003 20:42
Nový
└ 
Re: Prirazeni
CHe 10. 10. 2003 22:20
Nový
bez titulku
Michal Burda 11. 10. 2003 08:33
Nový
└ 
Re:
Jirka Hradil 13. 10. 2003 16:10
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem