kursy , szkolenia warszawa , e-book , audio book , poradniki , jak zarabiać , pieniądze , biznes , marketing e-commerce , e-biznes , zarabianie w sieci , servicetek group Bogdan Markowicz SG ,3 d e-learning , second life w edukacji , edukacja , 3d E-learning kursy i szkolenia Online |||S|G||| – Kurs PHP cz 11 Klasy w PHP5

Kurs PHP cz 11 Klasy w PHP5

Post image of Kurs PHP cz 11 Klasy w PHP5

11. Klasy w PHP5

11.1. Różnice pomiędzy PHP4 i PHP5

W nowym PHP nie wprowadzono wiele zmian. Poprawiono obsługę plików XML, dodano obsługę wyjątków i ? co najważniejsze ? przebudowano model obiektowy (obsługę klas), który można teraz porównać do tego z C++ czy Javy.

11.2. Automatycznie wczytywanie

Wiele osób piszących skrypty oparte na obiektach umieszcza po jednej definicji klasy w pojedynczym ?includowanym? pliku. Jedną z najbardziej irytujących rzeczy jest napisanie listy includes na początku skryptu. Aby to rozwiązać, dodano funkcję __autoload(), która automatycznie wykona zaplanowanie zadania podczas tworzenia obiektu. Wyjątki typu fatal_error zwracane przez __autoload() nie mogą być wyłapane przez blok catch. Dla przykładu:

<?
function __autoload($klasa) {
require_once $klasa . ‘.php’;
}

$obj = new klasa1();
$obj2 = new klasa2();
?>

11.3. Konstruktory i destruktory

W poprzednich wersjach konstruktor musiał nazywać się tak samo jak klasa. Prowadziło to do pomyłek w tworzeniu klas pochodnych i ich kontruktorach. Teraz konstruktor każdej klasy nazywa się po prostu __construct() ? pamiętajmy o dwóch znakach podkreślenia na początku.

Destruktory są natomiast funkcjami uruchamianymi podczas niszczenia obiektu ? zazwyczaj jest to właśnie koniec skryptu. Destruktor ma postać __destruct() ? również zaczyna się od dwóch znaków podkreślenia. Dla przykładu:

<?
class zarowka {
function __construct() {
echo “żarówka włączona<br />”;
}
function __destruct() {
echo “zarowka wyłączona<br />”;
}
}
$zar1 = new zarowka;
?>

Skrypt ten da w wyniku następujący tekst:
żarówka włączona
żarowka wyłączona
Tekst z destruktora wyświetli się w tym wypadku, ponieważ nastąpi zniszczenie obiektu (czyli zazwyczaj dzieje się to przy zakończeniu skryptu, chociaż można też to zrobić ręcznie).

11.4. Referencje i klonowanie

W PHP4 tworzenie referencji do obiektu odbywało się za pomocą operatora &. Należało wykonać następujące przypisanie: $obiekt2 =& $obiekt1 (przy czym $obiekt2 = $obiekt1 tworzy po prostu kopię danego obiektu). W PHP5 zmieniono tę kwestię i teraz wyrażenie $obiekt2 = $obiekt1 tworzy referencję. Aby skopiować obiekt, należy użyć funkcji clone(obiekt), która jako parametr pobiera obiekt do skopiowania, a zwraca nowy obiekt ($obiekt2 = clone($obiekt1)). Dla przykładu:

<?
class zarowka {
var $wlaczona;
function __construct() {
$this->wlaczona=’wlaczona’;
}
function pokaz() {
return $this->wlaczona;
}
}
$zarowka1 = new zarowka;
$zarowka2 = $zarowka1;
$zarowka1->wlaczona=”wylaczona”;
}
echo “zarowka2 jest “.$zarowka2->pokaz();
?>

Powyższy kod wyświetli wyrażenie ?zarowka2 jest wylaczona?, ponieważ $zarowka2 jest referencją do $zarowka1, a więc odnosi się do tych samych wartości zmiennych. Jeśli natomiast ktoś chciałby skopiować obiekt, należy zamiast linii $zarowka2 = $zarowka1 wstawić $zarowka2 = clone($zarowka1). Wtedy skrypt zwróci ?zarowka2 jest wlaczona?, ponieważ $zarowka2 będzie zupełnie innym obiektem, operującym na innych zmiennych.

11.5. 3xP, czyli klasy publiczne (public), chronione (protected) i prywatne (private)

W PHP5 każda metoda klasy lub jej zmienna może być zadeklarowana za pomocą jednego z trzech słów kluczowych:

  1. public(publiczna) ? zmienna lub metoda jest widoczna z całego skryptu,
  2. protected(chroniona) ? zmienna lub metoda jest widoczna tylko z obiektu, w którym się znajduje, bądź z jego obiektu podrzędnego,
  3. private(prywatna) ? zmienna lub metoda jest widoczna tylko z obiektu, w którym się znajduje.

Dla przykładu:

<?
class klasa1 {
public $public = ‘public’;
protected $protected = ‘protected’;
private $private = ‘private’;
function pokazZmienne() {
echo $this->public.’<br />’;
echo $this->protected.’<br />’;
echo $this->private.’<br />’;
}
}

$obj1 = new klasa1;
echo $obj1->public; //działa, z zewnątrz
tylko public jest dostępna
echo $obj1->protected; //fatal error
echo $obj1->private; //fatal error
$obj1->pokazZmienne(); //pokaże wszystkie
zmienne, z wewnątrz klasy wszystkie są dostępne

class klasa2 extends klasa1 {}
$obj2 = new klasa2;
echo $obj2->public; //działa
echo $obj2->protected; //fatal error
echo $obj2->private; //zmienna niezdefiniowana
$obj2->pokazZmienne(); //pokaże $public i $protected
// ale nie $private, gdyż nie została ona odziedziczona z klasa1
?>

W powyższym przykładzie wykorzystaliśmy zmienne, ale rzecz ma się tak samo w wypadku metod w klasie. Metoda publiczna jest widoczna nawet spoza obiektu, chronione i prywatne mogą być natomiast wywołane tylko z wnętrza obiektu. Dla przykładu: $klasa->metoda() wyświetli błąd fatal terror, jeśli metoda() jest chroniona bądź prywatna.

11.6. Interfejsy

Klasy mogą dziedziczyć tylko z jednej klasy nadrzędnej. Prowadziło to czasami do nadmiernego komplikowania drzewa klas. Aby temu zapobiec, w PHP5 wprowadzono interfejsy, które w rzeczywistości nie mają żadnych metod. Interfejs to tylko definicja metody i parametrów, które ona pobiera. Do klasy można później zaimplementować dowolną liczbę interfejsów, pod warunkiem że w klasie zostaną zadeklarowane metody z interfejsów. Jeśli nie będzie zadeklarowana jakaś metoda wymagana przez zaimplementowany interfejs, wyświetli się fatal error. Aby dołączyć interfejs, należy się posłużyć słowem implements. Dla przykładu:

<?
interface jasnosc {
function rozjasnij($wartosc);
function sciemnij($wartosc);
}
interface dzialanie {
function wlacz();
function wylacz();
}
class zarowka implements jasnosc, dzialanie {
function rozjasnij($wartosc) {
echo “rozjaśniam o “.$wartosc.”<br />”;
}
function sciemnij($wartosc) {
echo “ściemniam o “.$wartosc.”<br />”;
}
function wlacz() {
echo “wlączam<br />”;
}
function wylacz() {
echo “wylączam<br />”;
}
?>

11.7. Abstrakcje

W PHP5 wprowadzono abstrakcyjne klasy i metody. Są to specjalne klasy, na podstawie których nie można utworzyć obiektu, ale da się z nich dziedziczyć (to jest właśnie ich podstawowe zadanie). Służą one przede wszystkim jako bazy do tworzenia klas pochodnych. Abstrakcyjne metody to tylko ich deklaracje. Nie mogą zawierać kodu do wykonania, muszą być natomiast rozbudowane w każdej klasie potomnej.

Klasę lub metodę deklaruje się jako abstrakcyjną, wstawiając przed jej nazwę i typ (private, public, protected) słowo kluczowe abstract. W klasie, w której zaimplementowano metodę abstrakcyjną, musi ona być deklarowana z tym samym (bądź niższym) poziomem widoczności. Oznacza to, że jeśli w klasie abstrakcyjnej metoda była chroniona (protected), to w klasie potomnej może ona być chroniona lub publiczna. W przeciwnym wypadku wygenerowany zostanie błąd fatal terror ? Access level to klasa2::metoda() must be protected (as in class klasa1) or weaker. Dla przykładu:

<?
abstract class klasaBazowa {
abstract protected function func(); //wymuś
//rozbudowę metody
//w klasach pochodnych
protected function func2 () {//zwykła funkcja
echo “jakiś tekst”;
}
}
class klasa2 extends klasaBazowa {
protected function func() {
echo “inny tekst”;
}
}
?>

11.8. Metody i zmienne statyczne

Metody i zmienne statyczne to takie, do których dostęp można uzyskać z zewnątrz (bez konieczności definiowania obiektu danej klasy). Elementy statyczne definiowane są za pomocą operatora static, a dostęp do nich musi być ustawiony na publiczny. Nie można też używać wyrażenia $this-> jako odniesienia do aktualnej klasy. Zamiast tego używajmy self::. Zmienne z metody statycznej nie mogą być pobierane za pomocą operatora ->. Zamiast tego używajmy operatora Paamayim Nekudotayim, czyli :: (podwójnego dwukropka). Dla przykładu:

<?
class klasa {
public static $statyczna = ‘coś’;

public function wartosc() {
return self::$statyczna;
}
}
$klasa = new klasa;
echo klasa::$statyczna;
echo klasa::wartosc();
echo $klasa->statyczna; //nie zadziała
?>

11.9. __call()

W wypadku wywołania metody z klasy, która nie istnieje, uruchomiona zostanie metoda __call() (o ile została zadeklarowana). Może ona wykonać dowolny kod, pokazać błąd, zapisać log lub poinformować o tym, że dana metoda nie istnieje. Jeśli metoda __call nie zostanie zadeklarowana, pokaże się fatal error o treści call to an undefinied function. Dla przykładu:

<?
class klasa {
function __call ($name, $params) {
echo ‘Wywołałeś metodę ‘.$name.’.';
}
}
$klasa = new klasa;
$klasa->jakastam();//wyświetli ‘Wywołałeś metodę
jakastam, która nie istnieje’
?>

11.10. __set()

Metoda __set() służy do kontroli procesu zmiany wartości zmiennej w klasie. Ma dwa argumenty: nazwę zmiennej oraz jej nowej wartości. Dla przykładu:

<?
class klasa {
function __set ($name, $value) {
echo ‘Probujesz nadać zmiennej ‘
.$name.’ wartość ‘.$value;
}
}
$klasa = new klasa;
$klasa->zmienna = ‘cośtam’;
//wyświetli ‘Próbujesz nadać zmiennej zmienna wartość cośtam’
?>

11.11. __get()

Metoda __get() przechwytuje próby uzyskania dostępu do wartości zmiennej. Dla przykładu:

<?
class klasa {
function __get ($name) {
echo ‘Probujesz odczytać znienną ‘.$name;
}
}
$klasa = new klasa;
echo $klasa->zmienna;//wyświetli ‘Probujesz
odczytać zmienną zmienna’
?>

11.12. final

Dzięki słowu kluczowemu final nie jest możliwe redefiniowanie metody w klasie pochodnej. Jeśli nastąpi próba redefiniowania metody finalnej, wyświetli się błąd. Dla przykładu:

final function funkcja() {/*instrukcje*/}

11.13. instanceof

Operator instanceof pozwala na sprawdzenie, czy obiekt jest powiązany z daną klasą lub interfejsem. Jeśli dany obiekt jest utworzony na bazie podanej klasy, jej klasy bazowej lub klasa implementuje dany interfejs, zwracana jest wartość TRUE. Dla przykładu:

<?
interface zarowki{}
//interfejs zarowki
}
class zarowkaBazowa implements zarowki {}
//klasa zarowkaBazowa
}
class zarowka extends zarowkaBazowa {}
//klasa zarowkaBazowa
}
$zarowka = new zarowka;
if ($zarowka instanceof zarowka)
//prawda – $zarowka to obiekt klasy zarowka
echo ‘$zarowka jest powiązana z klasą zarowka’;
if ($zarowka instanceof zarowkaBazowa)
//prawda – $zarowka to obiekt klasy zarowka
//(dziedziczonej po zarowkaBazowa)
echo ‘$zarowka jest powiązana z klasą zarowkaBazowa’;
if ($zarowka instanceof zarowki)
//prawda – klasa zarowkaBazowa implementuje
//interfejs zarowki
echo ‘$zarowka jest powiązana z interfejsem zarowki’;
?>

Posted by Bogdan Markowicz   @   20 Listopad 2009

Like this post? Share it!

RSS Digg Twitter StumbleUpon Delicious Technorati Facebook

0 Comments

No comments yet. Be the first to leave a comment !
Leave a Comment

Name

Email

Website

Previous Post
« Silverlight 4: nowa era w budowaniu aplikacji sieciowych? PDC 2009
Next Post
Kurs PHP cz 12 Data i czas »
Pismo nalezy do Servicetek Group   |   SG e-biznes e-commerce projektowanie www designed by SG Grupa e-learning