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

Zaostřeno na PHP

V pilotní části nového seriálu zaměřeného na PHP se podíváme do blízké budoucnosti této bezesporu populární technologie.

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

To, že PHP v dohledné době zaznamená výraznou změnu hlavně v oblasti týkající se objektů, je poměrně známá věc. Poprvé o tom padla na Rootu zmínka v rozhovoru Jirky Koska s jedním z autorů PHP, a že objektově orientované programování ve stávajícím PHP je řehole, jste se mohli přesvědčit při čtení seriálu PHP v objetí objektů.

Nová verze PHP s lepšími objekty je na spadnutí. Již delší dobu si ji můžete dokonce vyzkoušet v už druhé alfa verzi na www.php.net. V tomto článku bych se s vámi rád podělil o některé první dojmy.

Objekty se předávají odkazem

Změna v sémantice jazyka je opravdu radikální. Konečně můžete zapomenout na předávání odkazů na objekt (&=) a místo džungle zapomenutých ampersandů se věnovat skutečnému programování.

Dříve se s objektem zacházelo jako s obyčejnou proměnnou, takže když jste objekt přiřadili nějaké proměnné, ve skutečnosti se objekt zkopíroval a každá proměnná od toho okamžiku představovala jiný objekt. Přirozenější prací s objektem je předávání referencí (odkazem), ale to se ve „starém“ PHP muselo explicitně říct právě přiřazovacím příkazem s ampersandem (např. $b &= $a), což byl právě kámen úrazu. Na nutnost použití

& (a to nejen v přiřazovacích příkazech, ale i v definicích hlavičky funkcí, pokud jste chtěli objekty předávat jako parametry nebo je vracet jako výsledky funkcí) se často zapomínalo a vedlo to k mnoha záludným chybám. Od nynějška povinnost použití & odpadá a programování se tak stává mnohem intuitivnějším. Pokud chcete, aby dvě proměnné ukazovaly na jeden objekt, jednoduše napíšete $b = $a a hotovo.

Mějme následující kód:

<?php
class Test {

  var $hodn = 0;

  function zmen() {

    echo ++$this->a;
  }
}

$a = new Test();

$b = $a;
$a->zmen();
$b->zmen();

?>

Nové chování PHP ilustrují rozdílné výstupy. Zatímco dříve byste dostali 11, nyní to bude očekávaná dvanáctka.

Sjednocené konstruktory

Dříve se musely kontruktory (inicializační metody tříd, které se automaticky volají při vytvoření nového objektu) jmenovat stejně jako třída – podle toho se také v kódu rozpoznaly. Mělo to jednu nevýhodu. Je velmi časté a obvyklé, že se z konstruktorů tříd na některém místě volá i konstruktor nadřazené (rodičovské) třídy. Změna názvu třídy nebo výměna rodičovské třídy, ze které se dědí, ústila v nutnost opravy volání konstruktorů na různých místech kódu.

Nyní se konstruktory všech tříd označují stejně, a to identifikátorem __construct. Pokud chcete volat rodičovskou verzi konstruktoru, jednoduše napíšete parent::__con­struct(). Pokud u třídy konstruktor nespecifikujete, automaticky se použije konstruktor z nadřazené třídy (nebo prázdný konstruktor, pokud třída žádnou super-třídu nemá).

<?php
class Test {
  function __construct() {

    echo 'Test::__construct()<br>';
  }
}

class PodTest extends Test {

}

class PodPodTest extends PodTest {
  function __construct() {

    echo 'PodPodTest::__construct(), ';
    parent::__construct();
  }
}

$a = new Test();

$b = new PodTest();
$c = new PodPodTest();

?>

(Všimněte si volání konstruktoru nadřazené třídy pomocí identifikátoru parent::. Podobně se dají volat verze rodičovských metod z předefinovávané metody.)

Výstup:

Test::__construct()
Test::__construct()
PodPodTest::__construct(), Test::__construct()

Destruktory nově

Jestliže máme konstruktory sloužící k inicializaci objektu v době jeho vzniku, můžou se hodit i destruktory určené pro úklidové práce v čase zániku objektu. Ačkoliv nejsou destruktory v objektově orientovaných jazycích nic nového, v připravované verzi PHP se objevují poprvé.

Chcete-li třídě definovat destruktor, vytvořte novou metodu a pojmenujte ji __destruct. Destruktor se samočinně volá těsně před ukončením existence objektu. Objekt je automaticky zničen tehdy, když v programu neexistuje proměnná, která by na něj ukazovala. Tehdy není žádná možnost, jak s objektem pracovat a jádro PHP nemá důvod takový objekt dále držet v paměti.

Programátor má možnost uvolnit objekt z paměti i ručně. Slouží k tomu nový příkaz (a nové klíčové slovo) delete.

Jak a hlavně kdy se destruktory volají, je dobře vidět na následujícím příkladu:

<?php
class Test {
  var $nazev;

  function __construct($nazev) {

    $this->nazev = $nazev;
  }

  function __destruct() {

    echo 'Destrukce objektu ' . $this->nazev . '<br>';
  }

}


function bod() {
  static $n = 0;
  echo "Kontrolní bod $n<br>";
  $n++;

}


function delej() {
  $b = new Test('B');

}


bod();
$a = new Test('A');

bod();
delej();
bod();


$c = new Test('C');
bod();
delete $c;
bod();


$d = new Test('D');
bod();
$d = 'ahoj';
bod();

?>

Výstupem bude:

Kontrolní bod 0
Kontrolní bod 1
Destrukce objektu B
Kontrolní bod 2
Kontrolní bod 3
Destrukce objektu C
Kontrolní bod 4
Kontrolní bod 5
Destrukce objektu D
Kontrolní bod 6
Destrukce objektu A

…z čehož lze vypozorovat, že objekt A byl odstraněn až na konci skriptu, protože až tam končí oblast platnosti proměnné $a, která na něj udržuje odkaz. Objekt B byl uvolněn ihned po opuštění funkce

davame_internetu_obsah
       

delej(), kdy se znepřístupnila držitelka reference na něj – lokální proměnná $b. Rovněž můžeme vidět, že destruktory objektů C a D se volaly ihned po vykonání příkazu delete $c v prvním případě a přiřazení textového řetězce do proměnné $d v případě druhém.

Pokračování příště…

Michal Burda

Michal Burda

Michal Burda vystudoval informatiku a aplikovanou matematiku a nyní pracuje na Ostravské univerzitě jako odborný asistent. Zajímá se o data mining, Javu a Linux.

Školení: Hackujeme operační systém Android

 

Školení vám ukáže, jak se dostat k Linuxu (tzv. "rootování"), který se pod hezkou tváří Androida skrývá a jak ho naplno využít. Pomůže vám to při záloze dat, zvětšování prostoru pro aplikace nebo sdílení připojení k internetu a pokud chcete z telefonu dostat opravdové maximum, ukážeme vám, jak v něm vyměnit kompletní systém za lepší.

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

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

Přehled názorů

Hezke? Ano, ale pro koho?
Wejn 10. 9. 2002 04:14
Nový
├ 
Re: Hezke? Ano, ale pro koho?
Ondra Kudlik 10. 9. 2002 08:36
Nový
│
└ 
Re: Hezke? Ano, ale pro koho?
Wejn 11. 9. 2002 16:49
Nový
│
 
└ 
Re: Hezke? Ano, ale pro koho?
Cohen 30. 9. 2002 23:08
Nový
├ 
Re: Hezke? Ano, ale pro koho?
rs 10. 9. 2002 11:17
Nový
└ 
Re: Hezke? Ano, ale pro koho?
vaku 13. 9. 2002 07:45
Nový
 
└ 
Re: Hezke? Ano, ale pro koho?
Wejn 13. 9. 2002 17:58
Nový
 
 
├ 
Re: Hezke? Ano, ale pro koho?
xChaos 16. 9. 2002 00:06
Nový
 
 
│
└ 
Re: Hezke? Ano, ale pro koho?
Wejn 17. 9. 2002 01:18
Nový
 
 
├ 
Re: Hezke? Ano, ale pro koho?
transformator 26. 9. 2002 13:48
Nový
 
 
│
└ 
Re: Hezke? Ano, ale pro koho?
Wejn 29. 9. 2002 11:44
Nový
 
 
└ 
Re: Hezke? Ano, ale pro koho?
Cohen 30. 9. 2002 23:16
Nový
Prvni priklad
Thomas Cook 10. 9. 2002 07:27
Nový
└ 
Re: Prvni priklad
d.f.h 10. 9. 2002 12:51
Nový
?
Karel Pičman 10. 9. 2002 08:15
Nový
└ 
Re: ?
M 10. 9. 2002 14:10
Nový
 
└ 
Re: ?
lukas jirka 10. 9. 2002 14:14
Nový
 
 
└ 
Re: ?
M 10. 9. 2002 15:19
Nový
predavani hodnotou vs. odkazem
Frantisek Rysanek 10. 9. 2002 09:09
Nový
└ 
Re: predavani hodnotou vs. odkazem
Stefan 10. 9. 2002 14:52
Nový
 
└ 
Re: predavani hodnotou vs. odkazem
Kamil Sopko 9. 10. 2002 01:36
Nový
hmm, no nevim
binary_runner 10. 9. 2002 09:22
Nový
└ 
Re: hmm, no nevim
Wejn 11. 9. 2002 16:56
Nový
 
├ 
Re: hmm, no nevim
Petr Chloupek 12. 9. 2002 12:25
Nový
 
└ 
Re: hmm, no nevim
mol 15. 9. 2002 18:12
Nový
jednou to bude dobry jazyk :-)
Karel Zak 10. 9. 2002 10:12
Nový
└ 
Re: jednou to bude dobry jazyk :-)
Petr Chloupek 12. 9. 2002 12:25
Nový
 
└ 
Re: jednou to bude dobry jazyk :-)
Karel Zak 13. 9. 2002 08:00
Nový
 
 
└ 
Re: jednou to bude dobry jazyk :-)
xChaos 16. 9. 2002 00:10
Nový
Programatorske studium
rekvalifikace 10. 9. 2002 10:54
Nový
├ 
Re: Programatorske studium
anonymní uživatel 10. 9. 2002 19:51
Nový
│
├ 
Re: Programatorske studium
rekvalifikace 11. 9. 2002 15:33
Nový
│
│
└ 
Re: Programatorske studium
Wejn 11. 9. 2002 17:06
Nový
│
│
 
└ 
Re: Programatorske studium
Petr Chloupek 12. 9. 2002 12:33
Nový
│
│
 
 
└ 
Re: Programatorske studium
Wejn 12. 9. 2002 17:31
Nový
│
├ 
Re: Programatorske studium
rekvalifikace 11. 9. 2002 15:34
Nový
│
└ 
Re: Programatorske studium
Mac 15. 4. 2003 05:45
Nový
└ 
Re: Programatorske studium
Solvina 11. 9. 2002 09:37
Nový
 
└ 
Re: Programatorske studium
rekvalifikace 11. 9. 2002 11:07
Nový
PHP ZEND 2
Milan gacik 10. 9. 2002 11:32
Nový
bez titulku
Filip 10. 9. 2002 12:47
Nový
Objekty :-)
GoGo 10. 9. 2002 14:58
Nový
├ 
Re: Objekty :-)
Filip 10. 9. 2002 16:55
Nový
└ 
Re: Objekty :-)
Jira Novak 10. 9. 2002 21:06
Nový
destruktory
M 10. 9. 2002 15:08
Nový
└ 
Re: destruktory
Cohen 30. 9. 2002 23:26
Nový
bez titulku
VoY 10. 9. 2002 19:36
Nový
OT: dotaz-syntaxe
Pavel 'Goldenfish' Kysilka 11. 9. 2002 01:44
Nový
└ 
Re: OT: dotaz-syntaxe
Solvina 11. 9. 2002 09:44
Nový
Reference
Lampa 11. 9. 2002 08:01
Nový
└ 
Re: Reference
Solvina 11. 9. 2002 09:51
Nový
No, a co zpětná kompatibilita?
Miloslav Ponkrác 11. 9. 2002 11:38
Nový
PHP a promenne spolecne pro cely web
Smisek 11. 9. 2002 14:50
Nový
└ 
Re: PHP a promenne spolecne pro cely web
Wejn 11. 9. 2002 17:16
Nový
 
└ 
Re: PHP a promenne spolecne pro cely web
Smisek 11. 9. 2002 17:24
Nový
 
 
├ 
Re: PHP a promenne spolecne pro cely web
xChaos 11. 9. 2002 19:31
Nový
 
 
└ 
Re: PHP a promenne spolecne pro cely web
fuka 12. 9. 2002 05:36
Nový
Nestacim se divit...
xChaos 11. 9. 2002 19:28
Nový
├ 
Re: Nestacim se divit...
PavelK 12. 9. 2002 00:17
Nový
│
└ 
Re: Nestacim se divit...
xChaos 12. 9. 2002 17:05
Nový
└ 
Re: Nestacim se divit...
Wejn 12. 9. 2002 02:17
Nový
 
└ 
Re: Nestacim se divit...
xChaos 12. 9. 2002 17:40
Nový
 
 
├ 
Re: Nestacim se divit...
Wejn 12. 9. 2002 18:01
Nový
 
 
│
└ 
Re: Nestacim se divit...
xChaos 15. 9. 2002 23:34
Nový
 
 
│
 
├ 
Re: Nestacim se divit...
HK 16. 9. 2002 16:04
Nový
 
 
│
 
└ 
Re: Nestacim se divit...
Wejn 17. 9. 2002 01:29
Nový
 
 
├ 
Re: Nestacim se divit...
Miloslav Ponkrác 12. 9. 2002 20:04
Nový
 
 
│
└ 
Re: Nestacim se divit...
xChaos 15. 9. 2002 23:56
Nový
 
 
│
 
└ 
Re: Nestacim se divit...
Wejn 17. 9. 2002 01:38
Nový
 
 
└ 
Re: Nestacim se divit...
pc 13. 9. 2002 18:10
Nový
 
 
 
└ 
Re: Nestacim se divit...
Wejn 13. 9. 2002 18:48
Nový
 
 
 
 
└ 
Re: Nestacim se divit...
xChaos 15. 9. 2002 23:51
Nový
 
 
 
 
 
├ 
Re: Nestacim se divit...
anonymní uživatel 16. 9. 2002 10:29
Nový
 
 
 
 
 
│
└ 
Re: Nestacim se divit...
xChaos 25. 9. 2002 20:06
Nový
 
 
 
 
 
├ 
Re: Nestacim se divit...
Wejn 17. 9. 2002 01:51
Nový
 
 
 
 
 
│
└ 
Re: Nestacim se divit...
xChaos 25. 9. 2002 20:22
Nový
 
 
 
 
 
│
 
└ 
Re: Nestacim se divit...
Wejn 29. 9. 2002 11:53
Nový
 
 
 
 
 
└ 
Re: Nestacim se divit...
Wejn 17. 9. 2002 02:18
Nový
 
 
 
 
 
 
└ 
Re: Nestacim se divit...
xChaos 26. 9. 2002 13:49
Nový
 
 
 
 
 
 
 
└ 
Re: Nestacim se divit...
Wejn 29. 9. 2002 11:55
Nový
PHP nie je o OOP
xyz 16. 9. 2002 11:10
Nový
└ 
Re: PHP nie je o OOP
xChaos 25. 9. 2002 20:08
Nový
wow!
duf 2. 10. 2002 13:34
Nový
└ 
Re: wow!
Wejn 2. 10. 2002 16:04
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