Programowanie w języku PHP

Programowanie obiektowe w PHP

  • 2005-12-18 20:21
  • 11 komentarzy
  • 4299 odsłon
  • Oceń ten tekst jako pierwszy
Do tej pory zapewne tworzyłeś w php swoje strony stosując programowanie proceduralne. Ja proponuje wam teraz zastosować programowanie obiektowe. Ale co to znaczy? Programowanie proceduralne polega na stosowaniu procedur operujących danymi. Dane mogą być reprezentowane przez ciąg znaków, tablice, liczby lub dowolne inne struktury. W programowaniu obiektowym dane i kod są połączone. Razem tworzą obiekt. Tak zorganizowane programowanie jest dla nas bardziej naturalne. Jednak php jest językiem proceduralnym.  Ma on ograniczone możliwości co do języków obiektowych. Może w następnych wersjach to się zmieni.


1.Tworzenie pierwszego programu

Aby utworzyć jakiś obiekt musimy stworzyć najpierw jego klasę. Klasa jest to plan zawierający wszystkie funkcje i zmienne które będzie zawierać obiekt. Każda zmienna w php mają typy, tak samo każdy obiekt ma swoja klasę. Definicja klasy wygląda w następujący sposób:

<?php
class nazwaklasy
{
var $zmienna="jakas wartosc";
    function nazwafunkcji()
    {
        print $this->zmienna;
    }
}
?>


Definicja klasy zaczyna się od słowa class i nazwy klasy. Następnie występują zmienne i funkcje. Zmienna (zwana tez atrybutem) poprzedzona jest słowem var. Funkcje i zmienne nie mają nadawanych praw dostępu (tzn. publicznych, prywatnych i chronionych). Dostęp do nich mamy z każdego miejsca w kodzie. Dostęp do nich wymaga we wnętrzu klasy dodania na początku this-&gt; a poza k
lasą nazwy obiektu i -&gt;. Tworzenie obiektu wymaga przypisania do nazwy obiektu new i nazwa klasy. Wszystko to zademonstruje przykład.
<?php
class nazwaklasy
{
    var $zmienna="jakas wartosc";
    function nazwafunkcji()
    {
        print $this->zmienna;
    }
}
$obiekt=new nazwaklasy;
$obiekt->zmienna="inna wartosc";
$obiekt->nazwafunkcji();
?>

Jak widzimy na przykładzie zmienne klasowe nie mogą zawierać znaku $.


2.Konstruktory

Konstruktor jest są to funkcje które są uruchamiane podczas tworzenia objektu. Konstruktor musi mieć nazwę identyczna z nazwą klasy. Konstruktor może mieć argumenty. Może posłużyć do nadawania zmiennym wartości podczas tworzenia objektu.
<?php
class jakasklasa
{
    var $zmienna="jakas wartosc";
    function jakasklasa($wartoscpoczatkowa)
    {
        $this->zmienna=;
    }
    function jakasfunkcja()
    {
        print $this->zmienna;
    }
}



3.Dziedziczenie

Dziedziczenie jest to korzystanie z funkcji i zmiennych klasy bazowej przez klasę dziedziczącą.
<?php
class klasabazowa
{
    var $zmienna="jakas wartosc";
    function jakasfunkcja()
    {
        print $this->zmienna;
    }
}
class klasadziedziczaca extends klasabazowa
{
    var $innazmienna="inna wartosc";
    function innafunkcja()
    {
        print $this->innazmienna;
    }
}
$obiekt=new klasadziedziczaca;
 
$obiekt->zmienna="cos";
$obiekt->jakasfunkcja();
$obiekt->innazmienna="cos innego";
$obiekt->innafunkcja();
?>


Powyższy przykład przedstawia dziedziczenie. Mamy klasę bazową i klasę dziedziczącą. Klasa dziedzicząca za swoją nazwą ma słowo extends i nazwa klasy bazowej. Zaznaczamy tym dziedziczenie klas. Na przykładzie stworzyliśmy obiekt klasy klasadziedziczaca. Możemy korzystać zarówno z funkcji tej klasy jaki i z funkcji klasy klasabazowa poniważ klasa klasadziedziczaca dziedziczy z klasy klasabazowa. Co jednak się stanie gdy obie klasy maja funkcje o takiej samej nazwie. Otóż zostanie wywołana funkcja klasy dziedziczącej. Co jednak gdy chcemy wywołać funkcję klasy bazowej? Należy użyć konstrukcji klasabazowa::funkcja(). Jest to konstrukcja którą możemy także używać do wywoływania funkcji klasy bez tworzenia obiektu.
<?php
class klasabazowa
{
    var $zmienna="jakas wartosc";
    function jakasfunkcja()
    {
        print $this->zmienna;
    }
}
class klasadziedziczaca extends klasabazowa
{
    var $innazmienna="inna wartosc";
    function jakasfunkcja()
    {
        print $this->innazmienna;
    }
}
$obiekt=new klasadziedziczaca;
$obiekt->zmienna="cos";
klasabazowa::jakasfunkcja();
$obiekt->innazmienna="cos innego";
$obiekt->innafunkcja();
?>

11 komentarzy

Adam Boduch 2008-08-16 19:40

Przeciazac konstruktorow nie mozna w PHP, tak samo jak dziedziczyc z wielu klas (ograniczenie jezyka); destruktor to metoda __destruct()

bpskiba 2008-08-16 19:35

Fajnie, tylko za krótko. Co z przeciążaniem konstruktora, dziedziczeniem z wielu klas, destruktorem??

pp-layouts 2007-12-14 09:57

Ślicznie, nie ma się co czepić. Do Bru2usa: OOP (taka krótka nazwa na programowanie obiektowe) jest ZAWSZE lepsze od proceduralnego, a jeśli już filozofujemy, to jest lepsze wtedy, gdy język programowania wspiera OOP :)

Dorzuciłbym jeszcze przypis: http://pl.php.net/manual/en/language.oop5.php

BTW, właśnie przerabiam pewien portal na OOP / PHP5. Poezja. Wszystko na modułach, a co najlepsze - moduły dadzą się bez przeróbek wykorzystać w innych projektach. Oszczędność "czasu i atłasu" jest nie do zignorowania.

Do Krolika: vide wyżej, dyskusja mogłaby się co najwyżej zrobić, dlaczego php nie jest do końca obiektowe, ale imo to dyskusja nie na temat, bo w zasadzie sprowadza się do kwestii pisać w php czy w czymś innym. Ja tam piszę w php i jego obiektowość mi wystarcza, przynajmniej jeśli brać pod uwagę php5.

Adam Boduch 2006-03-07 13:05

Hmm... chyba troszke skromny ten tekst??

AndyPSV 2004-08-20 23:39

Ziomal: są minimalne niedopatrzenia, jednak nie czepiajmy się szczegółów.

- niepotrzebna spacja (funkcja nazwa funkcji to nie to samo co nazwafunkcji)
- znak > przy rozpoczynaniu skryptu.

Artykuł oceniam na b. dobry.

taipan 2004-06-27 01:16

Dobrze tłumaczysz :) Aż miło, że tak młody człowiek, potrafi tak dobrze zaprezentować materiał :)

Krolik 2004-04-28 12:44

Dobrze, ze nie napisal, dlaczego obiektowe jest lepsze, bo od razu by sie zrobila taka glupia dyskusja jak ostatnio na forum C++ (WinAPI kontra klasy).

ŁF 2004-04-13 14:24

kiepska ortografia i fatalna gramatyka, ale może być.

Bru2s 2004-04-12 15:27

Bardzo fajnie daje 5 :D tylko mogłeś jeszcze napisać czemu pisanie obiektowe jest lepsze od proceduralnego i w jakich przypadkach jest go lepiej stosować :)

Ziomal 2004-04-18 15:09

Nie zauważyłem żadnych błędów

Marooned 2004-04-12 22:43

Cały kod wrzuć w tagi <&#112;hp>.