Dnes je 21. října 2017  10:17
nepřihlášen  Neznámý   zaregistruj se
"Na složité problémy existují jednoduché, snadno pochopitelné nesprávné odpovědi."

PHP v objetí objektů (převzato)

Dnešním dílem náš seriál o objektově orientovaném programování v PHP dokončíme. Popíšeme si standardní funkce PHP pro práci s objekty a zamyslíme se nad zvyklostmi, které by měl OOP programátor v PHP dodržovat.


Další funkce

Kromě mechanismu tříd nabízí PHP ještě několik funkcí, které vám práci s objekty mohou zpříjemnit. Všechny jsou popsány v manuálu k PHP, proto zde jen v rychlosti:

Funkce Návratová hodnota Popis
get_class($objekt) řetězec Funkce vrací název třídy, jejíž instancí je objekt $objekt.
get_parent_class($objekt) řetězec Funkce vrací název předka (parent class) třídy, jejíž instancí je objekt $objekt.
get_class_methods($nazev_tridy) pole řetězců Funkce vrací pole názvů metod třídy, jejíž název je předán v řetězcovém argumentu $nazev_tridy. Pole obsahuje názvy všech dostupných metod, tedy i metod zděděných.
get_class_vars($nazev_tridy) pole řetězců Funkce vrací pole názvů deklarovaných atributů třídy, jejíž název je předán v řetězcovém argumentu $nazev_tridy. Pole obsahuje názvy všech atributů deklarovaných pomocí var (i zděděných).
get_object_vars($objekt) asociativní pole Funkce vrací asociativní pole atributů objektu $objekt. (Klíč = název atributu)
is_subclass_of($objekt, $rodicovska_trida) bool Funkce vrací true, jestliže objekt $objekt je instancí třídy, která je podtřídou třídy specifikované řetězcem $rodicovska_trida. Jinak vrátí false (i tehdy, je-li $objekt instancí třídy $rodicovska_trida!).
class_exists($nazev_tridy) bool Funkce vrátí true, jestliže třída daná řetězcem $nazev_tridy existuje. Jinak vrátí false.
method_exists($objekt, $nazev_metody) bool Funkce vrátí true, jestliže objekt $objekt disponuje metodou s názvem $nazev_metody. Jinak vrátí false.
get_declared_classes() pole řetězců Funkce vrátí pole názvů deklarovaných tříd. V některých verzích PHP může vracet i názvy některých speciálních tříd -- viz manuál k PHP.
call_user_method($nazev_metody, $objekt, $parametry...) různé Funkce zavolá na objekt $objekt metodu s názvem $nazev_metody a předá jí případné $parametry.... Vrací hodnotu získanou z výsledku volání dané metody.

Názvy tříd a metod vracené těmito funkcemi jsou vždy automaticky převedeny na malá písmena abecedy.

Dobré mravy

Chcete-li v PHP psát objektově, musíte více než kde jinde pamatovat na dobré mravy a nutit se psát čitelně. PHP, narozdíl od C či Javy, neprovádí žádné kontroly typů a chybu v syntaxi rozezná, až když na ni při zpracování narazí. To je zdrojem mnoha nepříjemných chyb, které se špatně hledají, a části z nich se vyvarujete, budete-li důsledně dodržovat jisté konvence a úmluvy.

Zcela byste se měli vyvarovat statických volání metod tříd uvnitř jiné třídy za jiným účelem, než je volání předefinované funkce -- ve 4. části jste mohli vidět, jaké psí kusy to dělá s proměnnou $this.

Všechny atributy, které chcete používat, byste měli důsledně deklarovat v sekci var definice třídy a nespoléhat se na skutečnost, že v případě neexistence třídního atributu vytvoří PHP atribut objektu.

Také byste si měli vytvořit nějaké konvence pojmenovávání. Proč si neodskočit do Javy:

  • názvy tříd -- psát dohromady, každé slovo názvu začíná velkým písmenem (např. MujUkazkovyNazevTridy)
  • názvy metod -- psát dohromady, první písmeno každého slova kromě prvního velké (např. nejakaMetoda())
  • názvy atributů -- psát malými písmeny, slova oddělovat podtržítkem (např. $nejaky_atribut)

Váš kód se tak stane čitelnějším a přehlednějším.

PHP neumožňuje skrývání (pomocí konstrukcí private jako v C či Javě), a to přináší další nepříjemnosti. Dobrým zvykem proto může být předsazování podtržítka '_' před atributy a metody, které nejsou určeny k použití z vnějšku. Lehce tak dáte uživateli vašich tříd (nebo sami sobě) najevo, které metody se mohou používat přímo a které ne.

Někteří programátoři si zvykli na pravidlo nepřistupovat z vnějšku k atributům objektů přímo, ale vytvářet speciální metody k tomu určené:

/*
implementace jednoducheho seznamu zbozi ve
virtualnim obchode
*/
class SeznamZbozi {
  var $_nazev_seznamu; # nazev seznamu zboží
  var $_pocet;         # pocet položek, jen ke čtení!
  var $_polozky;       # pole položek
 
  # metody pro práci s názvem seznamu
  function vlozNazev($novy_nazev) {
    $this->_nazev_seznamu = $novy_nazev;
  }
  
  function vratNazev() {
    return $this->_nazev_seznamu;
  }

  # metoda pro práci s atributem $pocet
  function vratPocet() {
    return $this->_pocet;
  }
 
  # ...další metody
}

Ke každému atributu definujte dvojici metod vloz... a vrat... (nebo anglicky set... a get...) a k atribitu přistupujte vyhradně jejich prostřednictvím. Má to hned dvě výhody. Za prvé, položkám, které chcete mít z vnějšku nepřístupné nebo jen ke čtení, uvedené metody nenapíšete nebo napíšete jenom verzi vrat -- a tak ihned vidíte, co si ke kterému atributu můžete dovolit. Druhou výhodou je možnost přidat později k ukládání nebo čtení hodnoty atributu nejaké akce navíc.

Například chcete pro ladicí účely vědět o každém zápisu hodnoty do atributu $_nazev_seznamu. Jednoduše upravíte metodu vlozNazev():

function vlozNazev($novy_nazev) {
  print 'Pozor! Změna názvu seznamu!';
  print ' Stará hodnota: ' . $this->_nazev_seznamu;
  print ' Nová hodnota: ' . $novy_nazev;
  $this->_nazev_seznamu = $novy_nazev;
}

Nebo po čase zjistíte, že atribut $pocet naší třídy SeznamZbozi je zbytečný, tak ho odstraníte a metodu vratPocet() přepíšete:

function vratPocet() {
  return count($this->_polozky);
}

Vše bez nebezpečí, že vám zbytek kódu, který třídu SeznamZbozi používá, přestane fungovat.

Závěr

Jak sami vidíte, programovat objektově v PHP lze. Otázkou však zůstává, nakolik je to příjemné a výhodné. Dostanete do rukou silné nástroje jako dědičnost a polymorfizmus, ale na druhou stranu špatným stylem programování si zavlečete do kódu mnoho nepříjemných chyb. Absence jakýchkoliv kontrol typů je zde citelnou nevýhodou. Pro někoho nezvyklé vlastnosti operátoru přiřazení stejně jako nulová podpora pro abstraktní třídy a nezabezpečené volání předefinovaných metod, to všechno je matoucí a bývá zdrojem chyb. A tak odpověď na otázku, zda PHP s OOP ano, či ne, zůstává jako vždy jen a jen na vás.


Autor: Michal Burda
Vytvořeno: 12.09.2001
Oblast: Programování




Související články:

30.12.2001  FreeTDS - z PHP na Linuxu do Microsoft SQL Serveru




Diskuse k článku "PHP v objetí objektů (převzato)":

DatumAutorPředmět
    zobraz vše    přidej komentář

Krátké zprávy:

  • 04.04.2005 20:47:51
    LinuxExpo: IBM, Red Hat, Mozilla i OpenOffice.org 2.0

    Ve dnech 12. až 14. dubna 2005, se uskuteční pátý ročník veletrhu LinuxExpo, největší středoevropské konference a výstavy zaměřené především na operační systém Linux, Open Source software a související témata. Letos bude LinuxExpo hostit Hotel Olympik v Praze, jehož reprezentativní prostory poskytují nejen vysoký standard, ale přinesou i komfortní zázemí konferenční části, na kterou kladou pořadatelé akce stále větší důraz. V rámci konferenčního programu shlédnou návštěvníci nejen celou řadu odborných a popularizačních přednášek, ale budou se moci zúčastnit i několika specializovaných konferencí.

    Tajemství strategie společnosti IBM ve vztahu k Linuxu a otevřeným standardům nám poodhalí hned první z konferenčních bloků v úterý 12.4. Zasvěcené informace se dozvíme přímo od specialistů IBM z Česka i zahraničí. Linux nezanedbává ani legendární SILICON GRAPHICS. O jeho využití nejen pro náročné vizualizace, ale třeba jako platformu pro budování infrastruktur moderních podnikových řešení budou hovořit zástupci SILICON GRAPHICS s.r.o. během středečního konferenčního programu. Pokud se chcete dozvědět více o distribuci Red Hat, určitě si nenechte ujít čtvrteční konferenci s názvem "Red Hat - Prostředí pro Byznys". Přinese ji distributor Red Hat v ČR, firma Servodata.

    Z dalších prezentovaných distribucí jmenujme například Mandrakelinux, zastoupený společností QCM. Přes rostoucí komerční specializaci nezapomíná LinuxExpo ani na neziskové a vzdělávací projekty, které se představí v rámci Free Linux Zone, připravované ve spolupráci se serverem Linuxsoft. Vydržíte-li do čtvrtečního odpoledne, můžete být přítomni exkluzivní premiéry nové verze populárního kancelářského balíku OpenOffice.org 2.0. David Majda z týmu Czilla přednese přednášku Mozilla pro vývojáře, prezentovat se budou také známá česká live distribuce Danix, DTP řešení pro Linux aplikace Scribus, databáze Firebird a mnoho dalších zajímavých projektů.

    Kompletní přehled konferenčního programu, stejně jako aktuální a podrobné informace o veletrhu LinuxExpo najdete na internetové adrese www.linuxexpo.cz. Tam se také návštěvníci mohou registrovat a získat tak volnou vstupenku na dny pro veřejnost, nebo si dokonce rezervovat místa na jednotlivých přednáškách.[RP]


  • 07.11.2002 23:42:55
    Red Hat Linux Advisory: glibc
    Synopsis: Updated glibc packages fix vulnerabilities in resolver
    Issue date: 2002-09-10
    Updated on: 2002-11-06
    Product: Red Hat Linux 6.2 7.0 7.1 7.2 7.3
    Keywords: glibc resolv DNS
    Více na LinuxToday.[RP]


  • 28.10.2002 22:51:34
    Red Hat Linux Advisory: ypserv
    Synopsis: Updated ypserv packages fixes memory leak
    Advisory ID: RHSA-2002:223-07
    Product: Red Hat Linux 6.2 7.0 7.1 7.2 7.3
    Keywords: ypserv memory leak
    Více na LinuxToday.[RP]


  • 20.10.2002 22:58:22
    Vyšlo nové beta jádro 2.5.44. Changelog naleznete zde.[RP]


  • 20.10.2002 22:36:08
    Red Hat Linux Advisory: mozilla
    Synopsis: Updated Mozilla packages fix security vulnerabilities
    Advisory ID: RHSA-2002:192-13
    Product: Red Hat Linux 7.2 7.3 8.0
    Více na LinuxToday. [RP]

    Archiv krátkých zpráv

    Oblasti:

    Informace:

  • Pokud chcete pro nás psát čtěte zde.
  • e-mail redakce: redakce@linux.poweroff.cz

  • Umístěte si náš banner na stránku





  • H E A D L I N E S


    PHPBuilder:
  • PHP Web Blog - Part 2
  • Creating an Online Survey - Part 2
  • PHP Web Blog - Part 1
  • Preventing Web Attacks with Apache
  • phpwiki - The Wiki for PHP Developers
  • Developing a Ajax-driven Shopping Cart with PHP and Prototype, Part 2
  • Developing a Ajax-driven Shopping Cart with PHP and Prototype
  • PHP Form Validation System: An Object-Oriented Approach
  • Validating PHP User Sessions
  • Preventing Spam When Using PHP's Mail Function

    LinuxToday:
  • Phoronix Test Suite Brings Linux Benchmarking to the Desktop
  • Open Source Tour of Europe: Portugal
  • Linux On Mars!
  • Hey FOSS Project, What's Your Pedigree?
  • How Linux Could Better Market Itself
  • Measuring Open Source Adoption the Hard Way
  • Wine 1.0 Review
  • Cobbler Pieces Together Mass Red Hat Linux Installations
  • Open Source Solves UK Cancer Charity Challenges
  • Bash Arrays



    Hledání

    Zadejte (několik) klíčových slov oddělených mezerou.
  • Hledej v článcích
  • Hledej v krátkých zprávách
  • fulltextové vyhledávání

    Nejčtenější články:

  • QMAIL - přechod na Maildir a instalace kompletního poštovního systému (363882)
  • RShaper - omezení rychlosti síťového provozu (83242)
  • PHP v objetí objektů (převzato) (65454)
  • Copyright © 2001 PowerNET