Programowanie obiektowe w PHP5 - pierwsze starcie

Rozpoczynając pracę nad nowym projektem, jedną z pierwszych rzeczy jaką musimy się zająć, jest struktura naszego kodu. Niezależnie czy przygotowujemy tylko formularz kontaktowy czy jakiś bardzo rozbuodowany system zarządzania treścią, sposób organizacji kodu na pewno wpłynie na wydajność i prostotę obsługi końcowej aplikacji.

Programowanie obiektowe a proceduralne

W programowaniu proceduralnym najczęściej koncentrujemy się na tworzeniu jak najbardziej spójnego kodu nakierowanego na uzyskanie konkretnych rezultatów. Oznacza to wykorzystujemy specjalizowane grupy funkcji zajmujących się rozwiązywaniem konkretnego problemu i niczym innym. Jedną z wad tak tworzonej aplikacji jest obsługa kodu. Jeżeli aplikacja rozrośnie się do olbrzymich rozmiarów, to programiści, będą zmuszeni do zajmowania się obsługą wielu niezaleznych funkcji, których logika często będzie do siebie zbliżona.

Z drugiej strony, programowanie obiektowe kładzie nacisk na tworzenie abstrakcyjnych związków i hierargii powiązanych ze sobą funksji. Podobne do siebie funkcje moga współdzielić pewną część wspólną, co bardzo ułatwia obsługę takiego kodu. Poprawiają się tez możliwości ponownego wykorzystania kodu, ponieważ dopasowanie kodu podstawowego do nowych wymagań nie stwarza wielkich trudności. Podejście obiektowe w programowaniu znacząco ułatwia pracę na projektami wielkich aplikacji, ponieważ pozwala na hermetyzację oraz modularyzację poszczególnych zbiorów operacji wymaganych przez różne części systemu. Niestety taka organizacja kodu ma swoją cene. Jeżeli system jest źle zaprojektowany, to może być nawet trudniejszy w obsłudze niż rozwiązanie alternatywne. Często zdarza się, że modularne nieco przyciężkie aplikacje obiektowe mogą stwarzać problemy z wydajnością.

Po przebrnięciu przez kłopoty związane z niską jakością aplikacji obiektowych przekonamy się, że tworzenie systemów za pomocą domyślnego zbioru obiektów, ma w sobie zalety, które doceni niemal każdy twórca oprogramowania. Po wstepie teoretyrcznym możemy w końcu przejść do sedna tematu czyli pracy z obiektami.

Definicje klas

Podstawową jednostką kodu w obiektowym modelu języka PHP jest klasa. Klasa pozwala na zgromadzenie powiązanych ze sobą funkcji i danych w ramach jednej jednostki. Taka hermetyzacja pozwala do ukrywania wewnętrznych operacji przed zewnętrznym kodem i ułatwia współpracę kodu zewnętrznego z danymi. Jednak jeżeli chcemy skorzystać z klasy musimy utworzyć jej obiekt.

Definiowanie klasy

Definiowanie klasy w jeżyku PHP jest niezmiernie proste, pewnie jak ktoś zauważy podobnie jak w języku C.

<?php
class NazwaKlasy
{
   
//tutaj mamy kod klasy
}
?>

Podany kod definiuje prostą klasę, wykorzystaliśmy w tym celu słowo kluczowe class, po którym podaliśmy nazwę.

Kod klasy możemy podzielić na dwię części właściwości oraz metody. W częsci z właściwościami możemy umieścić wszystkie dane przechowywane w obiektach, a w metodach umieścić wszystkie funkcje operujące na tychże danych.

Właściwości i metody

W celu zdefiniowania właściwości klasy, korzystamy z poniższej składni:

widoczność $nazwa_właściwości

W tej definicji zapis widoczność reprezentuje zakres widoczności w kodzie. Może on przyjmować trzy wartości: public, private oraz protected, znaczeniem ich zajmiemy się w dalszej części artykułu.

Wyobraźmy sobie, że posiadamy klasę Zwierzaki chcemy jej nadać właściwość kolor, to robimy to w następujący sposób:

<?php
class Zwierzak 
{
   private 
$kolor;
}
?>

Możemy również nadać jej od razu wartość:
<?php
class Zwierzak 
{
   private 
$kolor='czarny';
}
?>

W ten sposób od razu każdy utworzony obiekt klasy Zwierzak nędzie miał domyślnie kolor czarny. Nadajmy naszej klasie teraz dwie metody getkolor(), która będzie nam zwracać kolor zwierzęcia oraz setkolor(), która będzie nam zmieniać kolor.
<?php
class Zwierzak 
{
   private 
$kolor='czarny';

   public function 
getkolor()
   {
      return 
$this->kolor;  
      
/* zmienna $this jest referencją do naszego obiektu,
         oznacza to że zwracamy właściwość kolor naszej klasy */
   
}
   
   public function 
setkolor($nowykolor)
   {
      
$this->kolor=$nowykolor;
   }
}
?>

Używanie klas - egzemplarzy

Aby wokorzystać naszą klase, którą do tej pory utworzyliśmy musimy, wykonać następujący kod:

<?php
class Zwierzak 
{
   private 
$kolor='czarny';

   public function 
getkolor()
   {
      return 
$this->kolor;  
      
/* zmienna $this jest referencją do naszego obiektu,
         oznacza to że zwracamy właściwość kolor naszej klasy */
   
}
   
   public function 
setkolor($nowykolor)
   {
      
$this->kolor=$nowykolor;
   }
}

$zwierze=new Zwierzak(); //utworzenie obiektu naszej klasy
echo 'Kolor naszego zwierzaka: '.$zwierze->getkolor(); //wyświetlenie koloru
$zwierze->setkolor('biały'); //zmiana na nowy kolor
echo 'A teraz nasz zwierzak ma kolor: '.$zwierze->getkolor();
?>

Widoczność

Ktoś, kto już miał styczność z programowanie obiektowym powie dlaczego wykorzystaliśmy dwie metody, jeżeli mogliśmy ustawić widoczność właściwości $kolor na public i zrobić to "mniejszym nakładem pracy". Nasz klasa wraz z operacjami wyglądałaby tak:

<?php
class Zwierzak
{
   public 
$kolor='czarny';
}

$zwierze=new Zwierzak(); //utworzenie obiektu naszej klasy
echo 'Kolor naszego zwierzaka: '.$zwierze->kolor//wyświetlenie koloru
$zwierze->kolor 'biały'//zmiana na nowy kolor
echo 'A teraz nasz zwierzak ma kolor: '.$zwierze->kolor;
?>

Specjalnie zrobiłem to w tamten sposób, ponieważ pokazuje tu dobre praktyki związane z hermetyzacja właściwości od kodu zewnętrznego oraz pełną kontrolę klasy nad jej właściwościami. Wróćmy teraz do podtematu artykułu, a mianowicie widoczności. Widoczność jak juz zawuażyliśmy możemy nadawać metodą oraz właściwością. W PHP5 mamy trzy poziomy widoczności:

  • Widoczność typu public oznacza, że dana właściwość lub metoda jest dostępna dla dowlnego innego kodu, który chciałby z niej skorzystać. Jeżeli dla danej metody nie zostanie określona widoczność to domyślnie przyjmowana jest widoczność publiczna.
  • Definiując element klasy jako prywatny(private), sprawiamy, że jest on widoczny jedynie w ramach definicji klasy, do której sam należy. Wszystkie metody zdefiniowane w klasie moga z niego dowolnie korzystać, natomiast nie ma do niego dostępu żadna metoda/funckja zdefiniowana poza klasą.
  • Na koniec słowo kluczowe protected, sprawia ono, że dana metoda lub właściwość dostępna jest tylkow danej klasie oraz w innych klasach rozbudowujących tą klasę lub z niej wywiedzionych. Rozbudowywanie i dziedziczenie klas będzie omawiane w następnej części tego artykułu.

Definiowanie widoczności elementów klasy polega na dodwaniu orzedrostka przed normalną deklaracją metody lub właściwości.

Konstruktory i destruktory

W pewnych sytuacjach w czasie pracy z klasami chcielibyśmy miec możliwość automatycznego wykonania pewnych czynności w momencie tworzenia obiektu. Może tu chodzic o zainicjowanie pewncyh pramatrów, wykonaniu na samym początku jakichś metod czy sprawdzenia czy system, w którym tworzymy obiekt sprosta wymaganiom naszej klasy. W takich sytuacjach możemy się posłużyć konstruktorem. Aby go zdefiniować musimy utworzyć metodę o nazwie __construct() z widokiem publicznym. Spójrzmy na poniższy przykład:

<?php
class Zwierzak
{
   public function 
__construct(){
      echo 
'Tworzony jest właśnie obiekt klasy Zwierzak!';
   }
}

$zwierze=new Zwierzak();
?>

Po uruchomieniu tego kodu zobaczymy następujący komunikat:

Tworzony jest właśnie obiekt klasy Zwierzak!

Tak jak zakładaliśmy, kod zapisany w metodzie konstruktora został wykonany automatycznie w momencie utworzenia obiektu.

W PHP5 można korzystać z konstruktorów w stylu języka C czy PHP4 (metoda o nazwie identycznej z nazwą klasy), ale zalecane jest stosowanie metody __construct() związanej z nowym modelem obiektów.

Tak jak wszystkie inne metody i funkcje, konstruktory mogą również przekazywać parametry.

<?php
class Zwierzak
{
   private 
$kolor='czarny';
   private 
$nazwa;

   public function 
__construct($nazwa)
   {
      
$this->nazwa=$rodzaj;
   }
   
   public function 
getkolor()
   {
      return 
$this->kolor;
   }

   public function 
setkolor($nowykolor)
   {
      
$this->kolor=$nowykolor;
   }

   public function 
getnazwa()
   {
      return 
$this->nazwa;
   }
}

$zwierze=new Zwierzak('pies');
echo 
'Nasze zwierze to '.$zwierze->getnazwa().' i ma kolor '.$zwierze->getkolor();
?>

Wynikiem działania powyższego kody będzie:

Nasze zwierze to pies i ma kolor czarny

Wiemy już, że możemy wykonywać automatyczne operacje w czasie tworzenia obiektu, teraz zastanówmy się czy możemy również wykonywać automatycznie metody podczas niszczenia obiektu. Owszem służy do tego metoda zwana destruktorem. W PHP5 definiujemy ją jako publiczną metode o nazwie __destruct(). Wypróbujmy poniższy kod:

<?php
class Obiekt
{
   public function 
__construct()
   {
      echo 
"Obiekt klasy Obiekt został utworzony!\n";
   }

   public function 
__destruct()
   {
      echo 
"Obiekt klasy Obiekt został zniszczony!\n";
   }
}

$c=new Obiekt(); //tworzymy obiekt
echo "Jakieś działania na obiekcie!\n";
unset(
$c); //niszczymy obiekt
?>

Wynik działania będzie następujący:

Obiekt klasy Obiekt został utworzony!
Jakieś działania na obiekcie!
Obiekt klasy Obiekt został zniszczony!

Słowo kluczowe static

Czasami chcemy askorzystać z metody sanej klasy, ale bez konieczności tworzenia jej obiektu. W tym celu zostało wprowadzone słowo kluczowe static, które pozwala na udostępnianie w klasie metod i właściwości bez konieczności tworzenia nowego obiektu klasy. Spójrzmy na poniższy kod:

<?php
class Kwadrat
{
   public static function 
pole($a)
   {
      return 
$a*$a;
   }
}

$dl_boku=5;
echo 
'Pole kwadratu o boku długości '.$dl_boku.' wynosi: '.Kwadrat::pole($dl_boku);
?>

W wyniku działania powyższego kodu uzyskamy:

Pole kwadratu o boku długości 5 wynosi: 25

Dostęp do metod oraz właściwości statycznych uzyskujemu poprzez umieszczenie między nazwą klasy a motodą/właściwością podwójnego dwukropka "::". Podczas korzystania ze statycznych elementów klasy musimy pamiętać, że nie mają one dostępu do elemntów, które wykorzystują składnie "$this->" oraz podczas odwoływania się do właściwości przed nazwą musimy umieścić symbol dolara "$". Jeżeli odwołujemy się do tych elemntów wewnątrz klasy używamy słowa kluczowego "self", np. "self::pole();".

Your rating: Brak Ocena: 4.8 (5 votes)

Dodaj nową odpowiedź

Zawartość pola nie będzie udostępniana publicznie.
  • Adresy internetowe są automatycznie zamieniane w odnośniki, które można kliknąć.
  • Dozwolone znaczniki HTML: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Znaki końca linii i akapitu dodawane są automatycznie.
  • You can use the <go> tags just like the <a> for nicer urls.

Więcej informacji na temat formatowania