Prawo Murphy'ego: Idealny fachowiec wie absolutnie wszystko o niczym.
PHP - klasy

Zalety programowania obiektowego

Programowanie obiektowe to nie tylko moda. Posiada ono wiele cech umożliwiających bardzo efektywne i szybkie tworzenie systemów. Docenisz tym szybciej, im więcej systemów będziesz pisał. Posiadasz wtedy w swoich zasobach coraz więcej obiektów, które mogą być wykorzystane w kolejnych systemach z coraz niższym nakładem pracy.

Zaleta programowania obiektowego ujawnia się również w okresie konserwacji, rozbudowy oraz optymalizacji systemu. Poszczególne elementy składowe można poprawiać bądź wymieniać przy bardzo niewielkim ryzyku utraty funkcjonalności czy błędów w działaniu poprawionego systemu.

Klasy w PHP4 i PHP5

Pomiędzy PHP4 i PHP5 istnieją znaczne różnice, jeśli chodzi o tworzenie skryptów bazujących na klasach. Warto jest jednak znać oba modele obiektowe, gdyż wiele skryptów (bazujących na obiektach) nie ma jeszcze swoich wersji na PHP5, a z powodu dużej liczby różnic jest możliwe, że skrypty obiektowe z PHP4 nie zadziałają pod PHP5 i na odwrót. Jeśli mamy serwer z zainstalowanym PHP5, to uczmy się od razu modelu klas z PHP5. Warto jednak znać również programowania w PHP4 z wykorzystaniem klas.

W nowym PHP nie wprowadzono wiele zmian. Poprawiono obsługę plików XML, dodano obsługę wyjątków i przebudowano model obiektowy, który można teraz porównać do C++ lub Javy.

Poniżej najistotniejsze różnice w programowaniu obiektowym PHP w wersjach 4 i 5.

  PHP4 PHP5 Uwagi
Możliwość tworzenia klas i ich dziedziczenia TAK TAK
Deklaracja właściwości klasy
  • poprzez słowo kluczowe var;
  • wszystkie właściwości są publiczne.
Z wykorzystaniem słów kluczowych określających zasięg zmiennych:
  • public - zmienna / metoda dostępna z całego skryptu
  • private - zmienna / metoda widoczna tylko z obiektu w którym się znajduje
  • protected - zmienna / metoda widoczna z obiektu w którym się znajduje i z obiektu podrzędnego
W PHP5 można deklarować zmienne również w notacji PHP4, tzn. z wykorzystaniem var. Tylko metody publiczne mogą być wywoływane poprzez obiekt.
Konstruktor Wywoływany przez metodę o nazwie tej samej nazwie co nazwa klasy. Wywoływany przez metodę o nazwie __construct(). Jeśli programujemy w PHP5 podczas tworzenia obiektu uruchamiana jest metoda __construct(), a jeśli jej nie ma poszukiwana jest metoda o nazwie takiej samej jak klasa
Referencja Przez wyrażenie:
$obiekt2 = &$obiekt1
Przez wyrażenie:
$obiekt2 = $obiekt1
W PHP5 trzeba bardzo uważać przy tworzeniu referencji i klonów obiektu. Pamiętaj, że referencja to dalej ten sam obiekt, a klon to nowy obiekt utworzony z innego.
Klonowanie poprzez wyrażenie $obiekt2=$obiekt1 używając metody $obiect2=clone($obiekt1)
Interfejsy BRAK TAK Ze względu na brak dziedziczenia wielokrotnego wprowadzono w PHP5 interfejsy, które zawierają definicje metod, ale ich nie implementują. Implementowane Klasy muszą natomiast zawierać wszystkie metody zdefiniowane poprzez interfejs.

 

Przykład

Poniżej masz przykładową klasę obsługującą połączenie z bazą MySQL. Klasa jest w wersji PHP 4 i PHP 5. Obie klasy robią dokładnie to samo i w identyczny sposób się z nich korzysta, co widać w przykładzie.

Przykład pokazuje zalety korzystania z klas. W przypadku przejścia z serwera z PHP 4 na serwer z PHP 5 (lub odwrotnie) wystarczy tylko podmienić plik z klasą. Skrypt korzystający z bazy nie będzie wymagał żadnych zmian.

<?php

class MySQL
{   var $CONNECTION;           // identyfikator połączenia z serwerem MySQL

    /**
     * Konstruktor
     * @param string $server  - MySQL serwer
     * @param string $user    - użytkownik bazy
     * @param string $pass    - hasło 
     * @param string $dbase   - nazwa bazy
     * @return bool           - powodzenie łaczenia z bazą
     */
    
function MySQL($server=""$user=""$pass=""$dbase="")
    {   
$conn = @mysql_connect($server$user$pass);
        if (!
$conn or !@mysql_select_db($dbase)) return FALSE;
        
$this->CONNECTION $conn;
        return 
TRUE;
    } 
// koniec konstruktora

    
    /**
     * Wstawianie rekordów do tabeli
     * @param string $sql   - instrukcja SQL "insert"
     * @return              - ostatnio wygenerowany autonumer lub FALSE
     */
    
function insert($sql)
    {   if (empty(
$sql)) return 0;
        if (!
eregi("^insert"$sql)) return 0;
        if (empty(
$this->CONNECTION)) return 0;
        
$conn $this->CONNECTION;
        
$results = @mysql_query($sql$conn);
        if (!
$results) return 0;
        return 
mysql_insert_id();
    } 
// koniec funkcji

    
    /**
     * Pobieranie rekordów z bazy
     * @param string    $sql    - instrukcja SQL "select"
     * @return array[][]        - tabela z rekordami OR FALSE
     */
    
function select($sql)
    {   if (empty(
$sql)) return FALSE;
        if (!
eregi("^select"$sql)) return FALSE;
        if (empty(
$this->CONNECTION)) return FALSE;
        
$conn $this->CONNECTION;
        
$results = @mysql_query($sql$conn);
        if (!
$results or empty($results)) return FALSE;
        
$data = array();
        while (
$row = @mysql_fetch_assoc($results)) $data[] = $row;
        @
mysql_free_result($results);
        return 
$data;
    } 
// koniec funkcji

    
    /**
     * Aktualizacja rekordów tabeli
     * @param string    $sql  - instrukcja SQL "update"
     * @return bool           - ilość zaktualizowanych rekordów lub FALSE
     */
   
function update($sql)
    {   if (empty(
$sql))              return FALSE;
        if (!
eregi("^update"$sql))  return FALSE;
        if (empty(
$this->CONNECTION)) return FALSE;
        
$conn $this->CONNECTION;
        
$results = @mysql_query($sql$conn);
        if (!
$results) return FALSE;
        return @
mysql_affected_rows();
    } 
// koniec funkcji

    
    /**
     * Usuwanie rekordów z tabeli
     * @param string    $sql  - instrukcja SQL "delete"
     * @return bool           - ilość usuniętych rekordów lub FALSE
     */
    
function delete($sql)
    {   if (empty(
$sql))              return FALSE;
        if (!
eregi("^delete"$sql))  return FALSE;
        if (empty(
$this->CONNECTION)) return FALSE;
        
$conn $this->CONNECTION;
        
$results = @mysql_query($sql$conn);
        if (!
$results) return FALSE;
        return 
mysql_affected_rows();
    } 
// koniec funkcji

    
    /**
     * Wykonanie dowolnego zapytania do bazy
     * @param string    $sql  - instrukcja SQL
     * @return bool           - powodzenie: TRUE / FALSE
     */
    
function query($sql)
    {   if (empty(
$sql))              return FALSE;
        if (empty(
$this->CONNECTION)) return FALSE;
        
$conn $this->CONNECTION;
        
$results = @mysql_query($sql$conn);
        if (!
$results) return FALSE;
        return 
TRUE;
    } 
// koniec funkcji
// koniec klasy

?>
« wstecz   dalej »