PHP

Programowanie obiektowe w PHP

Ziomal

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.

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-> a poza k
lasą nazwy obiektu i ->. 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, przy odniesieniu się do pola klasy (zmiennej w klasie) korzystamy z $ tylko raz, na początku.

Konstruktory

Konstruktor jest są to funkcje które są uruchamiane podczas tworzenia objektu. Konstruktor musi nazywać się __construct() i może mieć argumenty. Może posłużyć do nadawania zmiennym początkowej wartości podczas tworzenia objektu.

<?php
class jakasklasa
{
    var $zmienna = "jakas wartosc";

    function __construct($wartoscpoczatkowa)
    {
        $this->zmienna = $wartoscpoczatkowa;
    }

    function jakasfunkcja()
    {
        print $this->zmienna;
    }
}

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 ponieważ 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? Nie ma takiej możliwości, dlatego że funkcja z klasy dziedziczącej przesłania funkcją z klasy bazowej. Jedynym sposobem jest napisanie wewnątrz klasy dziedziczącej konstrukcji parent::innafunkcja().

PHP

11 komentarzy

Cały kod wrzuć w tagi <php>.

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

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ć :)

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

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).

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

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.

Hmm... chyba troszke skromny ten tekst??

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

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

Ś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.