Definicje i wyrażenia

Zanim przejdziemy do przykładów należy przeczytać podstawowe definicje i wyrażenia używane w każdym obiektowym języku. Nie ważne czy jest to JAVA, C#, VC++ czy PHP5. Bez tych definicji nie będziecie w stanie zrozumieć jak działa obiekt i po co się go stosuje.

Klasa. Klasa jest szablonem obiektu. Dlatego też klasa zawiera kod definiujący sposób zachowania obiektu oraz jego współdziałanie z innymi obiektami. Za każdym razem, gdy programista tworzy obiekt w PHP, to w rzeczywistości tworzy klasę. Z tego powodu w książce niekiedy obiekt będzie nazywany klasą (class), ponieważ oba pojęcia są synonimami.

Właściwość (zmienne). Właściwość znajduje się w klasie i może przechowywać pewne informacje. W przeciwieństwie do innych języków programowania, PHP nie sprawdza rodzaju zmiennej właściwości. Sama właściwość może być dostępna tylko w danej klasie, także w jej podklasach bądź wszędzie. Generalnie właściwość jest zmienną zadeklarowaną wewnątrz klasy, ale nie wewnątrz jakiejkolwiek funkcji w danej klasie.

Metoda. Metoda to po prostu funkcja zdefiniowana w klasie. Podobnie jak właściwości, także metody mogą być dostępne dla trzech wymienionych wcześniej rodzajów użytkowników.

Hermetyzacja. Hermetyzacja jest mechanizmem łączącym kod z danymi, na których ten kod operuje, i oddzielającym tą strukturę od pozostałych elementów. Opakowanie danych i metod w pojedynczą jednostkę (nazywaną klasą) nosi nazwę hermetyzacji. Zaletą hermetyzacji jest to, że wykonuje ona swoje zadanie wewnątrz jednostki bez niepotrzebnego angażowania uwagi programisty.

Polimorfizm. Obiekty mogą być różnego rodzaju. Pojedynczy obiekt może posiadać odmienne właściwości i metody, które będą samodzielnie współdziałały z innymi obiektami. Jednak zbiór obiektów może również wywodzić się z obiektu nadrzędnego i tym samym zachować niektóre właściwości klasy nadrzędnej. Ten proces nosi nazwę polimorfizmu. Obiekt może więc być źródłem kilku innych obiektów, które będą zachowywały część jego właściwości.

Dziedziczenie. Kluczowym procesem tworzenia nowego obiektu poprzez rozbudowę innego jest dziedziczenie. Kiedy obiekt dziedziczy po innym obiekcie, wtedy podklasy (dziedziczące) otrzymują wszystkie właściwości i metody superklasy (klasy nadrzędnej, czyli tej, po której dziedziczą). Następnie podklasa może przetwarzać w dowolny sposób metody pochodzące z superklasy (ten proces nosi nazwę przeciążania). Łączenie. Ten termin określa zależności, jakie zachodzą między klasami zależnymi. Architektura słabego połączenia zapewnia znacznie większą możliwość ponownego użycia obiektu niż w przypadku ich silniejszego połączenia. Szczegółowy opis łączenia będzie przedstawiony w następnym rozdziale. Kwestie łączenia są bardzo ważne podczas projektowania dobrych obiektów.

Wzorzec projektowy. Opracowany po raz pierwszy przez „Bandę czterech”, wzorzec projektowy jest po prostu zbiorem sztuczek w programowaniu zorientowanym obiektowo, które służą do rozwiązania zestawu podobnych problemów przy zastosowaniu sprytniejszego podejścia. Korzystanie z wzorców projektowych (DP) może zwiększyć wydajność całego programu przy zachowaniu minimalnej ilości kodu pisanego przez programistów. Czasami optymalizacja projektu nie jest możliwa bez użycia wzorców projektowych. Z drugiej strony niepotrzebne i nieplanowane używanie wzorców projektów może doprowadzić do zmniejszenia wydajności programu. Wzorcom projektowym został poświęcony cały rozdział w niniejszej książce.

Podklasa. Kiedy obiekt pochodzi z innego obiektu, to ten wywodzący się jest nazywany podklasą obiektu, z którego pochodzi.

Superklasa. Klasa jest superklasą dla obiektu, jeśli wywodzi się on z danej klasy. Upraszczając, kiedy programista rozbudowuje obiekt, to obiekt rozbudowywany jest superklasą dla nowo tworzonego obiektu.

Egzemplarz. Podczas tworzenia obiektu poprzez wywołanie jego konstruktora zostaje utworzony egzemplarz. Upraszczając, po wykonaniu kodu, takiego jak $var = new Object();, w rzeczywistości tworzony jest nowy egzemplarz obiektu klasy. Aby dostać się do jego metod i własności należy w PHP używać operatora "->"

Rozszerzenia i metody specjalne:

Public. Każda właściwość lub metoda, która nie została wyraźnie zdefiniowana z użyciem słów kluczowych private (prywatna) bądź protected (chroniona), jest metodą publiczną (public). Dostęp do metod publicznych jest możliwy również z zewnątrz klasy, czyli jeśli jakaś metoda jest publiczna, to można ją wywołać w nowo stworzonym obiekcie tej klasy.

Private. Właściwości lub metody zadeklarowane z użyciem słowa kluczowego private (prywatne) nie mogą być wywołane z zewnątrz klasy. Jednocześnie dowolne metody wewnątrz tej samej klasy mogą bez problemu uzyskać dostęp do elementów prywatnych, czyli jeśli jakaś metoda jest prywatna, to nie można ją wywołać w nowo stworzonym obiekcie tej klasy.

Protected. To jest kolejny modyfikator dostępu, który ma znaczenie specjalne w programowaniu zorientowanym obiektowo. Jeżeli jakakolwiek właściwość lub metoda zostanie zdefiniowana z użyciem słowa kluczowego protected, to dostęp do niej można uzyskać tylko z poziomu podklasy, czyli jeśli metoda jest chroniona, to można się do niej dostać tylko wtedy, gdy stworzymy nową klasę dziedziczącą po klasie z metodą chronioną.

Konstruktor. Jest to metoda, która wykonuje się podczas tworzenia obiektu danej klasy. Aby stworzyć konstruktor wystarczy nazwać metodę tak samo jak klasę (w php można tworzyć konstruktor za pomocą __construct(), ale może być tylko jeden konstruktor w klasie, jeśli będą dwa, to wykona się ten zadeklarowany jako pierwszy).

function __construct() {echo "Tworzenie konstruktora";}

Destruktor. Jest to metoda, która wykonuje się podczas niszczenia obiektu.W php można ją stworzyć za pomocą

function __destruct() {echo"kod który chcemy wykonać"; }

Stałe. Aby stworzyć stałą wartość należy wpisać taki kod: const A=1; Należy zauważyć, że w php przy tak stworzonej zmiennej nie ma znaku dolara. Dostęp do takiej zmiennej też jest inny. Jeśli chcemy mieć dostęp do tej zmiennej w tej samej klasie, to należy użyć zamiast this słowa self o tak: self::ASC, a jeśli utworzyliśmy obiekt na tej klasie, to dostajemy się do zmiennej poprzez Nazwaklasy::A Dla przykładu:

class Nowy
{
const A=1;

}

Dostać się do takiej zmiennej można poprzez Nowy::A. Warto zwrócić uwagę, że dostęp do stałej klasy następuje z zewnątrz klasy za pomocą operatora :: umieszczonego tuż za nazwą klasy, a nie za nazwą egzemplarza klasy.

Static. Słowo static jest podobne do słowa const, ale te słowo można używać nie tylko dla wartości ale także, klas i metod. Dzięki tak zdefiniowanej klasie nie trzeba tworzyć egzemplarza danej klasy, aby dostać się do jej metod. Słowo static używamy wtedy, gdy mamy zdefiniowane konkretne wartości i chcemy je tylko uzyskać. W takich klasach używamy zamiast słowa this, słowo self, a dostęp do metod takiej klasy odbywa się za pomocą operatora "::", a nie "->".

Nadpisywanie. W rozszerzanym obiekcie (jeśli jakiś obiekt dziedziczy po innym) można nadpisać dowolną metodę (zdefiniowaną jako chronioną lub publiczną) i dowolnie zmieniać sposób jej działania. Aby kontrolować ten stan stworzono rozszerzenia final.

Final. Jeżeli metoda zostanie zdefiniowana z użyciem słowa kluczowego final, to nie będzie mogła zostać nadpisana w żadnej podklasie. Dlatego też, jeżeli programista nie chce, aby dana metoda była nadpisywana, to wystarczy zdefiniować ją jako final.

Interface. Interfejs jest pustą klasą, która zawiera jedynie deklaracje metod. Dlatego też każda klasa implementująca dany interfejs musi zawierać deklaracje zawartych w nim funkcji. Interfejs jest więc jedynie zbiorem ściśle określonych reguł, które pomagają w rozszerzaniu dowolnej klasy oraz ścisłej implementacji wszystkich metod zadeklarowanych w interfejsie. Klasa może stosować dowolny interfejs, używając słowa kluczowego implements.

Przykład:

<?
interface Driver
{
public function connect();
public function execute($sql);
}

?>

Warto zwrócić uwagę, że w interfejsie można jedynie zadeklarować metody, ale nie można umieścić w nim definicji tychże metod. Oznacza to, że w interfejsie części główne wszystkich metod pozostają puste i deklaruje się je dopiero w klasie używającej interfejsu. Stosuje się to wtedy, gdy chcemy mieć dostęp np. do różnego typu baz danych poprzez te same metody. Wtedy nad projektem może pracować kilka osób, a i tak na koniec będzie ten sam efekt.

Klasa Abstrakcyjna. Klasa abstrakcyjna jest niemal taką samą konstrukcją jak interfejs, za wyjątkiem faktu, że deklarowane w niej metody mogą posiadać definicje. Ponadto klasa abstrakcyjna musi być „rozszerzana”, a nie „implementowana”. Dlatego też, jeżeli rozszerzane klasy posiadają metody o takich samych funkcjach, to te funkcje można zdefiniować w klasie abstrakcyjnej. Stosuje się to wtedy, gdy metody z klasy abstrakcyjnej są wspólne dla wielu klas dziedziczonych. Warto zwrócić uwagę, że cały kod w klasie abstrakcyjnej został już wcześniej napisany. Nie trzeba więc umieszczać go ponownie w klasie sterownika (dziedziczonej), jak miałoby to miejsce w przypadku interfejsu. Jeśli uczynimy jakąś metodę abstrakcyjną, to trzeba taką metodę nadpisać tak jakby to był interfejs.