YGREG.COM - Klasy w PHP 

29.07.2004
Nowa oferta hostingowa.

29.07.2004
Kurs XPath.

13.10.2002
Poprawiony problem z oznaczaniem przeczytanych wiadomości na forum.

13.06.2002
PHP z Zend Engine 2 już dostępne!

17.02.2002
Zmiany w organizacji serwisu.








Początek strony

(C)opyright 1997-2007
by Grzegorz Plebański
INDEX I ARTYKUŁY I SKRYPTY I DOWNLOAD

Dodaj stronę
do ulubionych

Artykuły i kursy
   PHP
   XML
   CGI
   HTML
   Inne

Skrypty PHP
   Komunikacja
   Księgi gości
   Statystyki
   Głosowania
   Bannery
   Inne
Skrypty CGI

Download



Klasy w PHP





Wstęp

        Pisząc ten artykuł zakładam, że znasz już dobrze podstawy PHP. Bardzo przydatna będzie znajomość podstaw programowania obiektowego, ale bez niej też będzie można sobie poradzić. Jeżeli nie znasz jeszcze PHP zapraszam do przeczytania mojego kursu PHP.



Czym są klasy i obiekty

        Pojęcia klasy i obiektu to podstawowe pojęcia w programowaniu zorientowanym obiektowo. Klasa jest czymś w rodzaju szablonu, na podstawie którego są tworzone obiekty. Najprościej będzie to pokazać na przykładzie. Na początek stworzymy prostą klasę:
   
class osoba
{
   var $imie, $email;
}

Ten kod nie powoduje jeszcze stworzenia żadnych zmiennych. Zostaną one utworzone dopiero kiedy stworzymy obiekt tej klasy:
   
$ktostam=new osoba;

Teraz mamy zmienną $ktostam która jest obiektem klasy osoba. Zmienna $ktostam zawiera zmienne $imie i $email. To znowy najlepiej będzie pokazać na przykładzie:
   
$ktostam->imie="Leon";
$ktostam->email="leon@costam.pl";

Zwróć uwagę, że po znaku -> nie ma już znaku $.



Jedna klasa, wiele obiektów

        Mając zdefiniowaną klasę możemy stworzyć wiele jej obiektów. Każdy z nich będzie miał osobną kopię zmiennych należących do klasy:
   
$ktostam=new osoba;
$ktostam->imie="Leon";
$ktostam->email="leon@costam.pl";

$ktostaminny=new osoba;
$ktostaminny->imie="Józef";
$ktostaminny->email="józek@costam.pl";

echo($ktostam->imie."
<BR>"
     .$ktostaminny->imie);

Tutaj ważna uwaga - odwołań do pól klasy nie można umieszczać wewnątrz napisów. Czyli ostatniej lini z powyższego kodu NIE MOŻNA zapisać jako
   
echo("$ktostam->imie <BR>
    $ktostaminny->imie"); // ŹLE!!!




Funkcje w klasach

        Wewnątrz klasy można także umieścić definicję funkcji. Robi się to z kilku powodów. Po pierwsze pozwala to na wprowadzenie pewnego porządku - dane i funkcje które na nich operują są ze sobą wyraźnie powiązane. Po drugie funkcje należącą do klasy wywołuje się dla konkretnego obiektu. Wewnątrz tej funkcji można używać zmiennych należących do obiektu. Znowu przykład:
   
class osoba
{
   var $imie, $email;

   function wypiszDane()
   {
      echo($this->imie.
         "
<BR><A HREF=".
         $this->email.">".
         $this->email.
         "</A><BR>");
   }
}

$ktostam=new osoba;
$ktostam->imie="Leon";
$ktostam->email="leon@costam.pl";

$ktostam->wypiszDane();


Jak widać w funkcji wypiszDane używam zmiennej $this. Zmienna ta oznacza obiekt dla którego została wywołana funkcja (w tym przykładzie $ktostam).



Konstruktor

        Konstruktor jest specjalną funkcją, która jest wywoływana automatycznie natychmiast po utworzeniu obiektu klasy. Konstruktorem klasy jest funkcja o nazwie takiej samej jak klasa:
   
class osoba
{
   var $imie, $email;

   function osoba()
   {
      $this->imie="Twoje imię";
     
 $this->email="Twój email";
   }
}




Tablice obiektów

        Obiekty klasy mogą być elementami tablicy:
   
class osoba
{
   var $imie, $email;
}

$pracownicy[0]=new osoba;
$pracownicy[0]->imie="Stefan";
$pracownicy[0]->email="stefan@cos.pl";

$pracownicy[1]=new
 osoba;
$pracownicy[1]->imie="Adam";
$pracownicy[1]->email="adam@cos.pl";

$pracownicy[2]=new
 osoba;
$pracownicy[2]->imie="Wojtek";
$pracownicy[2]->email="wojtek@cos.pl";


        Żaden problem, prawda? Rzeczywiście. Ale kłopot pojawi się gdy będzie trzeba np. posortować tę tablicę alfabetycznie według imion. Gdyby była to zwykła tablica z imionami - możnaby po prostu użyć funkcji sort. Ale tutaj będzie potrzeban funkcja usort. Funkcja usort różni się od sort tym, że pozwala użyć własnej funkcji do porównywania elementów. Zaczniemy więc od definicji tej funkcji:

   
function cmp($a, $b)
{
   return(strcmp($a->imie, $b->imie));
}

        Funkcja cmp musi zwracać -1, 0 lub 1 w zależności od tego, czy pierwszy parametr jest mniejszy, równy lub większy od drugiego. Teraz posortowanie tej tablicy będzie już proste:

   
usort($pracownicy, "cmp");




Dziedziczenie

        Dziedziczenie pozwala na stworzenie nowej klasy przez rozszerzenie już istniejącej. Klasa dziedzicząca (potomna)ma wszystkie zmienne i funkcje klasy po której dziedziczy, oraz ewentualne nowe zmienne i funkcje. Teraz pokażę jak na podstawie klasy osoba utworzyć klasę pracownik:

   
class osoba
{
   var $imie, $email;
}

class pracownik extends osoba
{
   var $pensja;

   function dajPodwyzke();

   {
      $this->pensja+=50;
   }
}

        Klasa pracownik zawiera zmienne $imie, $email i $pensja, oraz funkcj ę dajPodwyzke. Sposób użycia tej klasy będzie taki sam jak w poprzednich przykładach. Jest tylko jednen problem - przy tworzeniu klasy potomnej nie jest wywoływany konstruktor klasy rodzica. Czyli po wykonaniu kodu:

   
class a
{
   var $liczba;
   function a()
   {
      $this->liczba=7;
   }
}

class b extends a
{
   var $innaliczba;
   function b()
   {
  
    $this->innaliczba=2;
   }
}

$obiekt=new b;

        $obiekt->liczba nie jest równe 7. Można temu zaradzić wywołując konstruktor klasy rodzica w konstruktorze klasy potomnej:

   
class b extends a
{
   var $innaliczba;
   function b()
   {
      $this->a();
      $this->innaliczba=2;
   }
}

        Teraz po stworzeniu obiektu klasy b zostanie też wywołany konstruktor klasy a.
        To już chyba wszystko co chciałem napisać. Jeżeli masz jakieś pytania lub komentarze, jak zwykle zapraszam na forum.


Grzegorz 'Ygreg' Plebański
ygreg@ygreg.com
http://www.ygreg.com