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.
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.
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 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
}
?>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 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;
}
?><?php
class Zwierzak
{
private $kolor='czarny';
}
?><?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;
}
}
?>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();
?>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;
?>Definiowanie widoczności elementów klasy polega na dodwaniu orzedrostka przed normalną deklaracją metody lub właściwości.
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();
?>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();
?>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
?>Obiekt klasy Obiekt został utworzony!
Jakieś działania na obiekcie!
Obiekt klasy Obiekt został zniszczony!
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);
?>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();".
Dodaj nową odpowiedź