JustPaste.it

Wstęp do programowania obiektowego - Bazy danych - Podstawy PHP

Zanim nawiążemy nasze pierwsze połączenie z bazą z poziomu PHP, musimy zostać krótko zaznajomieni z podstawami programowania obiektowego, niezbędnego, aby zacząć naszą zabawę z biblioteką PHP Data Objects.

Czym jest OOP?

Skrót OOP pochodzi od terminu Object-Oriented Programming, czyli po polsku "programowanie zorientowane obiektowo". Określa się nim pewną strukturę i organizację kodu źródłowego. Dotychczas wszystkie nasze przykłady bazowały na programowaniu strukturalnym, opartym o funkcje i zmienne globalne. W programowaniu obiektowym programista operuje na klasach i obiektach. Programowanie obiektowe zyskało bardzo dużą popularność dzięki temu, że znacznie lepiej przystaje do rzeczywistości, jest zatem po prostu intuicyjne. Wytłumaczymy to na przykładzie.

Monitor, na którym najprawdopodobniej czytasz ten tekst, jest pewnym obiektem pewnej klasy ("monitor"). Klasa ta definiuje zachowanie oraz możliwe właściwości wszystkich monitorów na świecie (lub danego producenta, jeśli wolisz), natomiast sam obiekt nadaje tym właściwościom odpowiednie wartości. Spójrzmy na to w ten sposób: ty masz monitor kremowy z odświeżaniem 75 Hz, twój kolega ma monitor w ciemnej obudowie z odświeżaniem 85 Hz. Jednak mimo odmiennych właściwości, nadal są to obiekty tego samego rodzaju: monitor, zatem zachowują się identycznie i mogą być używane w identycznych celach. Niemniej nie znaczy to, że wszystkie NARAZ robią to samo. Klasa "monitor" po prostu opisuje ich zachowanie, a co obiekty robią w danej chwili - zależy tylko od nas, programistów. W programowaniu obiektowym identyczny tok rozumowania został przeniesiony do języka programowania.

Podstawy OOP

Aby móc tworzyć obiekty, potrzebna nam jest jakaś klasa. Tworzy się ją w PHP bardzo prosto. Piszemy słowo kluczowe class, podajemy nazwę klasy i wewnątrz nawiasów klamrowych definiujemy całą jej strukturę składającą się z deklaracji pól (czyli opisu, jakie właściwości mogą posiadać jej obiekty) oraz metod będących w zasadzie funkcjami wewnętrznymi klasy, wykonujących jakieś operacje:

<?php

class osoba
{
public $imie; // 1
public $nazwisko;

public function ustawPersonalia($imie, $nazwisko) // 2
{
$this -> imie = $imie; // 3
$this -> nazwisko = $nazwisko;
} // end ustawPersonalia();

public function personalia()
{
return $this -> imie.' '.$this -> nazwisko;
} // end personalia();
}

$osoba = new osoba; // 4
$osoba -> ustawPersonalia('Adam', 'Kowalski'); // 5

echo $osoba -> personalia(); // 6
?>

Oto opis poszczególnych części kodu:

  1. Tutaj deklarujemy, że każdy obiekt klasy "osoba" będzie posiadać pola (dalej będziemy posługiwać się właśnie tym terminem, mówiąc o właściwościach) imie oraz nazwisko. Nazwa pola musi zaczynać się od znaku dolara i być poprzedzona słowem kluczowym public (są też inne, ale ich znaczenie omówimy sobie później).
  2. Tutaj tworzymy metodę klasy (zwaną czasem funkcją wewnętrzną), która będzie wykonywać na jej obiektach określone zadanie - w tym konkretnym przypadku będzie ustawiać personalia. Składnia jest praktycznie identyczna, jak podczas tworzenia normalnych funkcji. Nowością jest słowo kluczowe public na samym początku, i choć tym razem można je bezkarnie opuszczać, jego pisanie jest dobrym zwyczajem.
  3. Każdy obiekt jest w PHP reprezentowany przez zmienną. Aby dostać się do jego pól oraz metod, musimy użyć specjalnego "wskaźnika" ->, a potem wywołać to, co nam jest potrzebne. Zwróć uwagę, że nazw pól nie poprzedzamy już teraz znakiem dolara! Pora także wytłumaczyć, co to za zmienna $this. Przecież nigdzie jej nie tworzymy, ale z niej korzystamy. $this jest właściwie pewnym trikiem. Wskazuje zawsze na obiekt, który wywołał daną metodę, pozwalając jej na modyfikację jego właściwości (po to przecież istnieje).
  4. Mając już klasę, możemy przystąpić do tworzenia obiektów. Robi się to w podany tutaj sposób: operator new tworzy nowy obiekt podanej klasy, co pozwala np. przypisać go do określonej zmiennej. W tym wypadku - do zmiennej $osoba.
  5. Tutaj wywołujemy metodę na stworzonym właśnie obiekcie. Pamiętasz, co napisaliśmy o zmiennej specjalnej $this wewnątrz metody? Będzie ona teraz wskazywała właśnie na obiekt $osoba, dzięki czemu zostaną do niego przypisane imię i nazwisko podane jako parametry metody.
  6. Wywołujemy kolejną metodę, która zwraca nam personalia naszej osoby.

Skopiuj kod powyższej klasy do nowego pliku - zajmiemy się jeszcze jednym przykładem na niej opartym:

<?php

// tu jest kod klasy

$bazaOsob = array();
// Tworzymy pierwsza osobe
$bazaOsob[0] = new osoba;
$bazaOsob[0] -> ustawPersonalia('Adam', 'Kowalski');

// Tworzymy druga osobe
$bazaOsob[1] = new osoba;
$bazaOsob[1] -> ustawPersonalia('Jan', 'Nowak');

// Tworzymy trzecia osobe
$bazaOsob[2] = new osoba;
$bazaOsob[2] -> ustawPersonalia('Zbigniew', 'Bogacki');

// Zobaczmy, jak skonczyla sie nasza zabawa w Boga

foreach($bazaOsob as $osoba)
{
echo 'Jestem '.$osoba -> personalia().'<br/>';
}
?>

W przykładzie tym stworzyliśmy sobie trzy obiekty osoba i zapisaliśmy do tablicy. Puszczając po niej pętlę foreach możemy zapoznać się z personaliami każdej z nich. Zapis $osoba -> personalia() oznacza po prostu podanie personaliów aktualnie wyświetlanej osoby.

Pamiętaj, że personalia możesz przypisać także bardziej łopatologicznie, np. $osoba -> imie = 'Józef';

Obiekty i zmienne

W naszych dotychczasowych rozważaniach zakładaliśmy, że obiekt jest zmienną. I w sumie mamy rację... ale tylko, mówiąc o przedpotopowym PHP 4. W PHP 5 zmienna obiektowa jest jedynie referencją do właściwego obiektu, zatem napisanie $a = $b, wykona tylko kopię samej referencji, a nie całego obiektu. Obiekt przestaje istnieć, jeżeli nie prowadzi do niego już żadna referencja.

Takie założenie ma dużo zalet. Wystarczy tylko wymienić przekazywanie obiektów jako parametry funkcji/metod lub zwracanie ich jako wynik działania. W PHP 4 było to możliwe jedynie po karkołomnych zabawach z operatorem &. W PHP 5 kod jest czysty i schludny. Jeżeli już naprawdę czujemy potrzebę wykonania kopii obiektu, musimy zapoznać się ze słowem kluczowym clone. Jeszcze raz skopiuj kod naszej klasy do naszego trzeciego przykładu:

<?php

// Tu wstaw kod klasy

$facet1 = new osoba; // 1
$facet1 -> ustawPersonalia('Adam', 'Kowalski');

echo '$facet1 to '.$facet1 -> personalia().'<br/>';
echo '<hr/>';
// Zobaczymy, co sie stanie
$facet2 = $facet1; // 2
$facet2 -> imie = 'Jan';

echo '$facet2 to '.$facet2 -> personalia().'<br/>';
echo '$facet1 to '.$facet1 -> personalia().'<br/>'; // 3
echo '<hr/>';

// Operator przypisania nie działa? Pora, aby do akcji wkroczyła inżynieria genetyczna
// Oto pierwsze w historii klonowanie człowieka:

$facet3 = clone $facet1; // 4
$facet3 -> imie = 'Michał';

echo '$facet3 to '.$facet3 -> personalia().'<br/>'; // 5
echo '$facet1 to '.$facet1 -> personalia().'<br/>';

// Sukces!
?>

Krótki opis:

  1. Na początek tworzymy sobie jakiegoś faceta i nadajemy mu imię.
  2. Próbujemy w "tradycyjny" sposób wykonać kopię. Dla potwierdzenia "obiektowi" $facet2 zmieniamy imię.
  3. Jednak podczas wyświetlania okazuje się, że imię zmieniło się także w $facet1! Wniosek: $facet2 i $facet1 to ten sam obiekt.
  4. Aby wymusić skopiowanie samego obiektu, a nie tylko referencji, musimy posłużyć się operatorem clone. Znowu dla testu zmieniamy imię w $facet3.
  5. I osiągamy sukces. W $facet1 imię pozostało niezmienione. Teraz obiekt udało się sklonować.

Krótko o wyjątkach

Dla pełni jasności przy omawianiu biblioteki PDO musimy wspomnieć także o wyjątkach, które zawitały do PHP wraz z pojawieniem się wersji 5.0.0. Wyjątek to obiekt wbudowanej klasy Exception tworzony przez nas, kiedy zajdzie jakaś nieprzewidziana sytuacja. Przechwytuje go specjalny blok kodu, który może wtedy odpowiednio nań zareagować. Dlaczego po prostu nie napisać sobie do tego zadania prostej funkcji lub posłużyć się poleceniem trigger_error()? Te specjalne bloki przechwytujące wyjątki można w sobie zagnieżdżać. Dzięki temu możliwa jest taka sztuczka: wyobraźmy sobie, że cała nasza aplikacja objęta jest potężnym blokiem, który wyłapuje wszystkie wyjątki związane np. z dostępem do katalogów i prezentuje jednolity komunikat błędu. Jednak fragment tej aplikacji nie traktuje ewentualnych problemów z dostępem w kategoriach życia i śmierci, dlatego tworzymy tam nowy blok, który potraktuje problem łagodniej. Jeżeli teraz wyjątek powstanie wewnątrz niego, zajmie się nim lokalna część aplikacji. Jeśli poza nim - nasz uniwersalny wyłapywacz.

Jeżeli nie za bardzo rozumiesz powyższy opis, nie przejmuj się. Wyjątki będą szeroko omawiane dalej. Teraz informacja ta jest nam potrzebna głównie po to, że biblioteka PDO (i nie tylko) za ich pomocą raportuje kłopoty. Oto przykład działania wyjątków:

<?php
try // 1
{
$tekst = @file_get_contents('plik.txt');

if($tekst === false)
{
throw new Exception('Nie można otworzyć pliku plik.txt!'); // 2
}

echo 'Nasz tekst: '.$tekst; // 3
}
catch(Exception $wyjatek) // 4
{
echo $wyjatek -> getMessage(); // 5
}
?>

Opis skryptu:

  1. Tak rozpoczynamy blok, w którym chcemy łapać wyjątki.
  2. Słowem kluczowym throw, po którym podajemy obiekt klasy Exception, wysyłamy wyjątek. Zauważ, że po nazwie klasy podaliśmy parametr, zupełnie jak w przypadku funkcji/metody. Otóż samo tworzenie obiektu też jest w zasadzie metodą i może zostać przez nas oprogramowane, pobierając także parametry. Wrócimy do tego później, na razie wystarczy wiedzieć, że coś takiego jest możliwe.
  3. Wysłanie wyjątku powoduje automatyczny skok do bloku oznaczonego punktem 4. Dlatego jeżeli skrypt nie znajdzie pliku, ta instrukcja się już nie wykona.
  4. Do tego miejsca skacze skrypt, kiedy przechwyci wyjątek i tu możemy go oprogramować. W nawiasie podajemy nazwę klasy wyjątku, której obiekty chcemy wyłapywać, a następnie nazwę zmiennej, do jakiej należy zapisać przechwycony wyjątek.
  5. Wyświetlamy zapisany w wyjątku komunikat błędu.

Zakończenie

Jesteśmy już gotowi do zapoznania się z biblioteką PDO i wykonania naszych pierwszych połączeń z bazą MySQL. Do programowania obiektowego wrócimy później, poświęcając mu cały wielki rozdział tego podręcznika.

 

Treść pochodzi ze strony WikiBooks i jest udostępniana na licencji GNU FDL

 

Autor: WikiBooks