Poslední dobou jsem se věnoval hlavně Javě, kdo ji zakusil už u ní obvykle zůstal. Proto když jsem před časem dělal web na objednávku v PHP přenesl jsem jsi pár „manýrů” k ulehčení práce z Javy do PHP.

Základní vlastnosti Objektu

Kdo alespoň o Javu někde zakopl, ví, že je to jazyk založený na OOP, kde každá třída dědí třídu Object, která má ve svém kódu uloženy základní metody (JavaDoc).

Rozhraní ObjectInterface

Když jsem programoval datové třídy pro přístup databázi. Byl jsem znechucen neustálým psaním, přístupu k proměnným stylem getProměnná(), setProměnná(value), který zbytečně zvětšoval objem kódu u jednoduchých tříd. Jako řešení s může nabídnout změnit přístup k proměnným na public a přistupovat k nim jednoduše $class->value. Toto řešení je ovšem z pohledu OOP trochu zvrácené, proto jsem naprogramoval následující rozhraní(interface), které poskytuje 2 metody pro manipulaci s proměnnýma třídy.

PHP:
  1. <?php
  2. /**
  3. * ObjectInterface interface
  4. * @author Ondřej Fibich
  5. * @version 1.0
  6. *
  7. * This interface was created, because of I was bored use Java Beans structure
  8. * to set and get inner values from class.
  9. * @example JavaBeans structure for inner value $property:
  10. *      Object getProperty() and void setProperty(Object $value)
  11. * This type of structure is the best, but if you have more values in your class.
  12. * it's better to just implement this interface and have less code in your class.
  13. * @example My structure for inner value Property:
  14. *      Object get(string $property) and void setProperty(string $property, Object $value)
  15. */
  16. interface ObjectInterface {
  17.   /**
  18.      * Sets inner value of class named as key with value
  19.      * @param string $key
  20.      * @param string $value
  21.      */
  22.     public function set($key, $value);
  23.    /**
  24.      * @return inner value of class named as key
  25.      */
  26.     public function get($key);
  27. }
  28. ?>

Třída Object

Dalším krokem bylo vytvoření třídy Object, která bude rozhraní implementovat a budou ji dědit všechny ostatní třídy. Na první pohled se zdá ObjectInterface jako zbytečné, stačilo by přece jen třída Object, ne? Samozřejmě, ale představte si situaci kdy potřebujete implementaci pozměnit, v potomku můžete sice překrýt metody, ale není to tak precizní a přehledné řešení jako implementace ObjectInterface. Druhým důvodem je třída, která už dědí z jiné a proto nemůže dědit z Object. (V PHP může každá třída dědit jen z 1 jiné třídy, ale implementovat libovolný počet rozhraní.)

PHP:
  1. <?php
  2. /**
  3. * Class Object
  4. * @author Ondřej Fibich
  5. * @version 1.0
  6. */
  7. class Object implements ObjectInterface {
  8.     public function set($key, $value) {
  9.         if (isset($this->$key)) {
  10.             $this->$key = $value;
  11.         }
  12.     }
  13.     public function get($key) {
  14.         if (isset($this->$key)) {
  15.             return $this->$key;
  16.         } else {
  17.             return null;
  18.         }
  19.     }
  20. }
  21. ?>

Pozn. Třída ignoruje chyby (nedefinovaná proměnná), doporučuji však použít vyjímek k oznamování chyb.

Použití Object

Jak jsem psal výše, nápad jsem dostal při programování datových tříd databáze, proto uvedu příklad právě s ní. Vezměme tedy tabulku Osoba, která by mohla vypadat zhruba nápodobně:

MySQL:
  1. CREATE TABLE `Osoba` (
  2. `ID` INT( 11 ) NOT NULL ,
  3. `name` VARCHAR( 100 ) NOT NULL ,
  4. PRIMARY KEY ( `ID` )
  5. ) ENGINE = MYISAM

Datová třída vypadá následovně:

PHP:
  1. <?php
  2.  class Osoba extends Object {
  3.      protected $ID;
  4.      protected $name;
  5.      public function __construct($ID) {
  6.          // načte data z databáze do třídy s ID == $ID
  7.      }
  8.      public function __destruct() {
  9.          // uloží data do databáze
  10.      }
  11.  }
  12. ?>

Práce se třídou:

PHP:
  1. <?php
  2.  $osoba = new Osoba(1); // načtení dat
  3.  echo $osoba->get("name"); // výpis dat
  4.  $osoba->set("name", "Otto von Bismarck"); // změna hodnoty
  5.  unset($osoba); // volám destructor
  6. ?>

Závěr

Ukázali jsme jsi jak jednoduše přistupovat k vnitřním proměnným třídy. Příště implementujeme Javovskou třídu Properties.