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 (po roce) 2

Pokračuje exkurze po vlastnostech a změnách syntaxe připravovaného PHP 5.

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

Typová kontrola

Za revoluční počin považuji zavedení nepovinné kontroly typů objektů předávaných jako parametry metodám nebo funkcím. Vše funguje takto: před jméno argumentu v deklaraci metody či funkce lze uvést název třídy (tj. typ argumentu) a PHP potom při každém volání dané metody nebo funkce kontroluje, jestli typy předávaných parametrů odpovídají deklaraci.

<?php
function nejakaFunkce(Trida $t) {
  ...
}

...

$obj1 = new Trida();
$obj2 = new DalsiTrida();
nejakaFunkce($obj1); // V pořádku
nejakaFunkce($obj2); // Vyvolá chybu v případě, že DalsiTrida
                     // není potomkem třídy Trida
?>

Uvádění typu předávaného objektu je nepovinné – nic se tedy nestane, pokud tento mechanismus nebudete využívat. Okradete se pouze o výbornou pomůcku ladění.

Kontrolovat lze tímto způsobem pouze objektové parametry. Nelze tedy psát např. function f(string $s) a podobně. Testy typů se provádějí v čase běhu skriptu. Špatný typ parametru se tedy odhalí, až když na příslušný řádek s chybným kódem při vykonávání PHP narazí. Nelze tedy spoléhat jako u jiných jazyků na to, že jedno spuštění (zkompilování…) odhalí všechny nesrovnalosti s typy.

Operátor instanceof

Tvůrci PHP se nikdy netajili tím, že PHP 5 bude vypadat jako Java. Koneckonců, není nutné neustále vymýšlet objevené a stejné věci pojmenovávat různě. Důkazem mohutné inspirace Javou budiž i nový operátor instanceof. Můžete pomocí něj jednoduše(ji) zjišťovat, jestli je daný objekt instancí třídy, rodiče třídy, nebo implementací rozhraní.

<?php
class JakasiTrida {
  ...
}

$cosi = new JakasiTrida();
...
if ($cosi instanceof JakasiTrida) {
  echo 'nazdar chlapi (a holky)';
}
?>

Ano, čtete dobře, v poslední větě jsem skutečně psal rozhraní – to je další lahůdka OOP zavlečená z Javy. Nikam neodcházejte a čtěte dále…

Rozhraní (interface)

Používání rozhraní (interface) je jedním ze způsobů, jak objektově modelovat náš složitý svět. Při objektově orientovaném programování se občas dostaneme do situace, kdy nějaká třída vykazuje takové vlastnosti, že by bylo vhodné, aby jejím předkem byly současně dvě různé třídy. Přidržím-li se příkladu s ovládacími prvky z minulého dílu a vezmu-li v úvahu hypotetickou třídu Form (formulář), pak tato třída by mohla být potomkem třídyOvladaciPrvek. Pokud bychom ale chtěli třídu Form udělat velice chytře, mohli bychom požadovat, aby automaticky zobrazila a nabídla k editaci obsah nějakého záznamu v databázi. Přístup do databáze je umožněn řekněme pouze potomkům třídy NacitaniDat a my máme problém: Form logicky patří do podstromu ovládacích prvků, ale zároveň je třeba, aby zvládal i načítání dat. Co s tím?

V C++ se podobné situace daly řešit vícenásobnou dědičností, ale kolize názvů položek rodičovských tříd přinášela víc problémů než užitku. V Javě (a teď už i v PHP) se s tím poprali jinak: zavedli rozhraní.

Pojem rozhraní souvisí s rolemi objektu, jaké hraje vůči okolnímu světu. Náš objekt typu Form z předminulého odstavce vystupuje jednou v roli ovládacího prvku (tehdy, když po něm řekněme budeme chtít, aby se „zobrazil“ na stránce) a jindy zase v roli čtečky dat (když bude třeba, aby si data „natáhl“ sám z databáze).

Zamyslíme-li se nad skutečným světem, i zde najdeme řadu objektů, které vystupují v různých rolích: vy sami jako objekty se nyní nacházíte v roli čtenáře článku na Rootu. Až dočtete, přepnete se možná do role návštěvníka kina, člověka, který jde uhasit žízeň do blízké restaurace nebo hospodyně prahnoucí po umývání schodů.

Interface je jazyková konstrukce určená k deklaraci takové role. Neslouží k definici žádného kódu. Pouze vyjmenovává, jaké akce můžeme od objektu disponujícího danou rolí očekávat. Příklad:

<?php
interface KonzumentPiva {
  public function kupPivo();
  public function konzumuj(Pivo $p);
  public function jdiNaWC();
}
?>

Máme-li definováno rozhraní, potřebujeme také nějakou třídu, která by dané rozhraní implementovala:

<?php
class Student implements KonzumentPiva {
  public function kupPivo() {
    ...
  }

  public function konzumuj(Pivo $p) {
    ...
  }

  public function jdiNaWC() {
    ...
  }
}
?>

Vtip je v tom, že zatímco může být třída zděděna pouze z jednoho předka, implementovat může takřka libovolný počet rozhraní (ta se potom uvádějí čárkami oddělená za klíčovým slovem implements v deklaraci třídy).

Jak rozhraní řeší náš problém s třídou Form? Jednoduše. Podle povahy problému se třeba rozhodneme, že Form budeme dědit z abstraktní třídyOvladaciPrvek a navíc bude implementovat rozhraní NacitaniDat, které reprezentuje roli objektu načítajícího data z databáze.

davame_internetu_obsah
       

Zatímco například v Javě jsou rozhraní přísně typově kontrolována, v případě PHP jde spíše o čistotu programování, která by nás měla vést k jejich používání. V PHP jakožto slabě typovém jazyce bychom se klidně bez rozhraní obešli. V malých prográmcích je to určitě pochopitelné, ale v rozsáhlejších projektech s desítkami tříd už trochu pořádku vneseného rozhraními neuškodí.

Dokončení 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í: Linux – Firemní server

Na třídenním školení se naučíte nainstalovat a spravovat kompletní linuxový server do Vaší firmy se všemi základními službami, které potřebujete pro provoz Vaší sítě, firemních emailů a webových stránek.

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

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

Přehled názorů

Úvod do OOP...
Yeti 2. 9. 2003 07:14
Nový
├ 
Re: Úvod do OOP...
hardcoder*ke 2. 9. 2003 08:43
Nový
│
├ 
Re: Úvod do OOP...
Pavel 2. 9. 2003 09:11
Nový
│
│
└ 
Re: Úvod do OOP...
hujer 2. 9. 2003 11:42
Nový
│
│
 
└ 
Re: Úvod do OOP...
Reset 3. 9. 2003 13:55
Nový
│
│
 
 
└ 
Re: Úvod do OOP...
anonymní uživatel 5. 2. 2006 12:39
Nový
│
│
 
 
 
└ 
Re: Úvod do OOP...
Rejpal 18. 11. 2007 10:54
Nový
│
└ 
Re: Úvod do OOP...
Vaclav Lorenc 2. 9. 2003 09:14
Nový
│
 
└ 
Souhlasim
Miloslav Ponkrác 2. 9. 2003 12:14
Nový
│
 
 
├ 
Re: Souhlasim
Solvina 2. 9. 2003 15:22
Nový
│
 
 
└ 
Re: Souhlasim
Tomáš Kocánek 2. 9. 2003 15:47
Nový
│
 
 
 
└ 
Re: Souhlasim
Miloslav Ponkrác 2. 9. 2003 19:11
Nový
└ 
Re: Úvod do OOP...
Michal Burda 2. 9. 2003 21:06
Nový
Perl na to!
Gig 2. 9. 2003 09:22
Nový
└ 
Re: Perl na to!
Martin Povolny 2. 9. 2003 09:45
Nový
 
├ 
Re: Perl na to!
Gig 2. 9. 2003 10:00
Nový
 
├ 
Ruby, python, Ocaml, ...
Yenya 2. 9. 2003 10:55
Nový
 
├ 
Re: Perl na to! - objektove programovani
Jan Kubik 2. 9. 2003 11:15
Nový
 
│
├ 
Produktivita
Miloslav Ponkrác 2. 9. 2003 12:17
Nový
 
│
│
└ 
Re: Produktivita
Jan Kubik 2. 9. 2003 13:13
Nový
 
│
│
 
└ 
Re: Produktivita
Miloslav Ponkrác 2. 9. 2003 13:48
Nový
 
│
│
 
 
├ 
Re: Produktivita
Michal Kubeček 2. 9. 2003 14:33
Nový
 
│
│
 
 
│
└ 
Re: Produktivita
anonymní uživatel 2. 9. 2003 16:40
Nový
 
│
│
 
 
│
 
└ 
Re: Produktivita
Michal Kubeček 3. 9. 2003 23:01
Nový
 
│
│
 
 
└ 
Re: Produktivita
Jan Kubik 2. 9. 2003 18:16
Nový
 
│
│
 
 
 
├ 
Re: Produktivita OOP
Miloslav Ponkrác 2. 9. 2003 19:11
Nový
 
│
│
 
 
 
│
└ 
Re: Produktivita OOP
Vaše jméno 8. 9. 2003 00:32
Nový
 
│
│
 
 
 
└ 
Re: Produktivita
Karel Mašát 7. 9. 2003 14:58
Nový
 
│
├ 
Re: Perl na to! - objektove programovani
hkmaly 2. 9. 2003 21:00
Nový
 
│
└ 
Re: Perl na to! - objektove programovani
Vítězslav Novák 3. 9. 2003 12:39
Nový
 
│
 
└ 
Re: Perl na to! - objektove programovani
Jan Kubik 3. 9. 2003 13:19
Nový
 
│
 
 
├ 
Pamatuji si
Miloslav Ponkrác 4. 9. 2003 00:22
Nový
 
│
 
 
│
├ 
Re: Pamatuji si
Vítězslav Novák 4. 9. 2003 09:34
Nový
 
│
 
 
│
│
└ 
Re: Pamatuji si
Miloslav Ponkrác 4. 9. 2003 10:35
Nový
 
│
 
 
│
├ 
Re: Pamatuji si
jezovec 4. 9. 2003 10:42
Nový
 
│
 
 
│
└ 
Re: Pamatuji si
Jan Kubik 4. 9. 2003 17:23
Nový
 
│
 
 
│
 
└ 
Re: Pamatuji si
Miloslav Ponkrác 5. 9. 2003 02:17
Nový
 
│
 
 
│
 
 
└ 
Re: Pamatuji si
Nakej student 1. 11. 2003 22:59
Nový
 
│
 
 
└ 
Re: Perl na to! - objektove programovani
Vítězslav Novák 4. 9. 2003 10:25
Nový
 
└ 
Re: Perl na to!
Miloslav Ponkrác 2. 9. 2003 12:15
Nový
Fortran?
Yenya 2. 9. 2003 10:50
Nový
├ 
Re: Fortran?
Miloslav Ponkrác 2. 9. 2003 12:24
Nový
│
└ 
Re: Fortran?
hkmaly 2. 9. 2003 20:52
Nový
└ 
Re: Fortran?
os 2. 9. 2003 13:13
Nový
 
└ 
Re: Fortran?
Joshua 2. 9. 2003 14:07
Nový
 
 
├ 
Re: Fortran?
Michal Burda 3. 9. 2003 09:43
Nový
 
 
└ 
Re: Fortran?
os 3. 9. 2003 17:11
Nový
Java
Tomas 2. 9. 2003 11:11
Nový
├ 
Re: Java
Miloslav Ponkrác 2. 9. 2003 12:24
Nový
│
├ 
Re: Java
tibor 2. 9. 2003 15:43
Nový
│
│
└ 
Re: Java
Miloslav Ponkrác 2. 9. 2003 19:13
Nový
│
│
 
└ 
Re: Java
dark lord of the sith 13. 8. 2006 01:16
Nový
│
└ 
Re: Java
hkmaly 2. 9. 2003 20:54
Nový
└ 
Re: Java
Petr Herma 2. 9. 2003 17:54
Nový
 
└ 
Re: Java
Marek Paška 2. 9. 2003 22:05
Nový
vysvetli mi prosim nekdo moznosti PHP vs ASP NET?
michal 3. 9. 2003 14:52
Nový
├ 
Re: vysvetli mi prosim nekdo moznosti PHP vs ASP N
Miloslav Ponkrác 3. 9. 2003 19:07
Nový
│
└ 
Re: vysvetli mi prosim nekdo moznosti PHP vs ASP N
Vaše jméno 8. 9. 2003 19:14
Nový
└ 
Re: vysvetli mi prosim nekdo moznosti PHP vs ASP NET?
Vaše jméno 8. 9. 2003 19:11
Nový
alternativní zápis podmínek a cyklů
Honza 6. 9. 2003 15:30
Nový
Interface
Jakub Podhorský 16. 9. 2003 15:34
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