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
?>
<?php
class MySQL
{ private $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ą
*/
public function __construct($server="", $user="", $pass="", $dbase="")
{ $conn = @new mysqli($server, $user, $pass, $dbase);
if (mysqli_connect_errno())
{ 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
*/
public function insert($sql)
{ if (empty($sql)) return FALSE;
if (!eregi("^insert", $sql)) return FALSE;
if (empty($this->CONNECTION)) return FALSE;
$conn = $this->CONNECTION;
$results = $conn->query($sql);
if (!$results) return FALSE;
return $conn->insert_id;
} // koniec funkcji
/**
* Pobieranie rekordów z bazy
* @param string $sql - instrukcja SQL "select"
* @return array[][] - tabela z rekordami OR FALSE
*/
public function select($sql)
{ if (empty($sql)) return FALSE;
if (!eregi("^select", $sql)) return FALSE;
if (empty($this->CONNECTION)) return FALSE;
$conn = $this->CONNECTION;
$results = $conn->query($sql);
if (!$results or empty($results)) return FALSE;
$data = array();
while ($row = $results->fetch_assoc()) $data[] = $row;
$results->close();
return $data;
}// koniec funkcji
/**
* Aktualizacja rekordów tabeli
* @param string $sql - instrukcja SQL "update"
* @return bool - ilość zaktualizowanych rekordów lub FALSE
*/
public function update($sql)
{ if (empty($sql)) return FALSE;
if (!eregi("^update", $sql)) return FALSE;
if (empty($this->CONNECTION)) return FALSE;
$conn = $this->CONNECTION;
$results = $conn->query($sql);
if (!$results) return FALSE;
return mysqli_affected_rows($conn);
}// koniec funkcji
/**
* Usuwanie rekordów z tabeli
* @param string $sql - instrukcja SQL "delete"
* @return bool - ilość usuniętych rekordów lub FALSE
*/
public function delete($sql)
{ if (empty($sql)) return FALSE;
if (!eregi("^delete", $sql)) return FALSE;
if (empty($this->CONNECTION)) return FALSE;
$conn = $this->CONNECTION;
$results = $conn->query($sql);
if (!$results) return FALSE;
return mysqli_affected_rows($conn);
}// koniec funkcji
/**
* Wykonanie dowolnego zapytania do bazy
* @param string $sql - instrukcja SQL
* @return bool - powodzenie: TRUE / FALSE
*/
public function query($sql)
{ if (empty($sql)) return FALSE;
if (empty($this->CONNECTION)) return FALSE;
$conn = $this->CONNECTION;
$results = $conn->query($sql);
if (!$results) return FALSE;
return TRUE;
}// koniec funkcji
/**
* Destruktor klasy
* @param void
* @return void
*/
public function __destruct()
{ $conn = $this->CONNECTION;
$conn->close();
} // koniec destruktora
} // koniec klasy
?>
<?php
// dołączenie pliku z klasą
include "includes/mysql.class.php";
/**
* Utworzenie obiektu klasy MySQL
* Zwróć uwagę, że sposób użycia obu klas jest identyczny
* i nie zależy od wersji PHP
*/
$mysql = new MySQL("localhost", "user", "haslo", "baza");
...........................................................
// Pobranie i wyświetlenie danych z bazy
$dane = $mysql->select("SELECT lp, imie, nazwisko
FROM lista
ORDER BY lp");
echo "<table border="1" cellpadding="5" cellspacing="0">
<tr><th>Lp</th>
<th>Nazwisko</th>
<th>Imię</th>
</tr>";
for($i=0 ; $i<count($dane) ; $i++)
{ echo "<tr><td> $dane[$i]['lp'] </td>
<td> $dane[$i]['nazwisko'] </td>
<td> $dane[$i]['imie'] </td>
</tr>";
}
echo "</table>";
...........................................................
// Aktualizacja danych w bazie
$n = $mysql->update("UPDATE lista SET
lp = lp + 1
WHERE lp > 10");
if($n !== FALSE)
echo "Zaktualizowano $n rekordów.";
else
echo "Aktualizacja nie powiodła się.";
...........................................................
/**
* Usunięcie obiektu "mysql".
* Tylko w przypadku PHP 5 wywołana zostanie funkcja __destruct().
* PHP 4 nie posiada destruktorów klasy.
*/
unset($mysql);
?>