warsztat programy magazyn firma z okładki newsy co na cd indeks
PHP
C
Co nowego
o
n
o
w
e
g
o
w
w piątej wersji PHP
p
i
ą
t
e
j
w
e
r
s
j
i
P
H
P
Sebastian Marek
Mimo że najnowsza wersja PHP, oznaczona numerem 5, nie jest
jeszcze dostępna, już dziś możemy poznać jej możliwości dzięki
pojawiającym się coraz częściej wersjom beta (najświeższa
to beta 3, do pobrania z serwisu http://www.php.net). Wszystko
wskazuje na to, że piątka odniesie wielki sukces.
Rys. 1. PHP 5 w wersji beta 2
zego nowego możemy się spodziewać w PHP5? Przede wszyst- Konstruktory i destruktory
kim obiektów! Nowy model obiektowy zadziwia możliwościami. W PHP4 sposób obsługi konstruktorów był bardzo prosty: ta metoda klasy,
CWprowadzono też obsługę wyjątków (błędów), wzorowaną na która nazywała się tak samo jak klasa, traktowana była jako konstruktor.
takich językach jak Java czy C++. Druga wersja silnika Zend oraz nowy Natomiast destruktorów nie było w ogóle. W PHP5 sytuacja ta zmienia się
menedżer pamięci powodują, że PHP5 działa szybciej, lepiej i stabilniej. diametralnie. Wprowadzono zunifikowaną obsługę konstruktorów oraz
Niektóre rozwiązania zaprezentowane w artykule można zastosować destruktorów poprzez stworzenie metod __construct oraz __destruct.
w PHP4, ale zostały one przytoczone w celu lepszego zrozumienia różnic, Konstruktor wywoływany jest przy każdym stworzeniu nowego obiek-
jakie występują między wersjami 4 i 5. Ponadto niektóre opcje w oficjalnym tu, natomiast destruktor chwilę przed jego zniszczeniem. Uruchomienie
wydaniu PHP5 mogą wyglądać i działać trochę inaczej niż w wersji beta. skryptu z listingu 1 (patrz CD) spowoduje wyświetlenie komunikatów
pokazanych na rys. 2a.
Nowy model obiektowy
Sposób obsługi obiektów w PHP5 został całkowicie przebudowany,
co zaowocowało zwiększeniem wydajności. W poprzednich wersjach
PHP obiekty traktowane były jak zwykłe typy zmiennych (np. zmienne
całkowite czy ciągi znaków). Każde odwołanie się do takiego obiektu
(przypisanie go do zmiennej czy przekazanie go jako parametru jakiejś
funkcji) skutkowało stworzeniem jego kopii. W nowym wydaniu modelu
obiektowego do każdego obiektu tworzony jest tzw. uchwyt (ang. handle),
czyli identyfikator, przy użyciu którego odwołujemy się do niego. Sposób
tworzenia obiektów i ich obsługi jest jednakowy w PHP4 i 5.
Rys. 2. Tak jak w innych językach programowania, tak i w PHP5
$obiekt = new MojaKlasa(); //inicjacja obiektu
konstruktor i destruktor są automatycznie wywoływane w momencie
klasy MojaKlasa
stworzenia oraz zniszczenia obiektu (a), a dostęp do pól
$obiekt->wyswietl_imie(); //wywołanie metody
i metod obiektu można ograniczyć (b)
klasy MojaKlasa
$zmienna = $obiekt->Imie; //przypisanie do
zmiennej właściwości klasy MojaKlasa Publiczne, prywatne, zastrzeżone
Na wzór takich języków jak C++, Pascal czy Java w PHP5 rozgraniczono
Wielu programistów do dzisiaj nie wie o takim sposobie obsługi obiektów także dostęp do właściwości oraz metod klasy. Istnieją trzy słowa kluczo-
w PHP4, dlatego też zmiana ta nie powinna w jakikolwiek sposób wpłynąć we, które umożliwiają określenie dostępu do danej metody czy właściwości
na działanie aplikacji napisanych w PHP4. W najgorszym wypadku trzeba klasy: public, private oraz protected. Ramka obok przedstawia różnice wy-
będzie wprowadzić do istniejących już programów drobne poprawki. Aby stępujące między nimi, a listing 2 (na CD) ich praktyczne zastosowanie.
ułatwić przejście z PHP4
do PHP5, twórcy zaimple- Dostęp do właściwości i metod klasy
mentowali w PHP5 opcję
auto-clone, która spowo- Public Private Protected
Właściwość lub metoda klasy Tylko metody należące do tej Tylko metody należące do tej
duje wymuszenie kopio-
jest dostępna spoza niej. samej klasy mają dostęp do samej klasy lub do klasy
wania obiektów w taki
Oznacza to, że można się do właściwości lub metod tej dziedziczącej mają dostęp
sposób, jak to było ob-
niej odwołać bezpośrednio. klasy. do właściwości lub metod
sługiwane we wcześniej-
tej klasy.
szych wersjach PHP.
INTERNET.luty.2004
97
W
s
z
y
st
ki
e
li
k
st
u
ł
ingi
u
z
n
z
a
t
j
d
e
g
u
o
j
ą
a
s
n
r
e
i
t
ę n
j p
y
-
ł
a
yc
d
i
o
e
ł
C
P
ą
H
c
D
z
P
w k
o
5
-
-
p
at
r
z
alogu
ykl
a
d
o
we
li
st
ingi.
indeks co na cd newsy z okładki firma magazyn programy warsztat
PHP
Wyjątki elseif( $ _year > 2005 )
W PHP4 programowało się łatwo, szybko i przyjemnie do momentu, gdy {
w kodzie wystąpił jakiś błąd. Tragedia następowała wtedy, gdy według throw new Exception( Rok nie może być większy od
nas aplikacja chodziła stabilnie, a od klienta dostawaliśmy informację, że 2005 , 2 );
coś nie działa. Widzę programistów błagających o pomoc: dlaczego nie ma }
obsługi wyjątków? No i są! Na wzór innych języków programowania dosta-
jemy w prezencie pętlę try& catch oraz wspomagającą obsługę wyjątków Na koniec zabezpieczymy się przed wystąpieniem nieprzewidywalnego
klasę macierzystą Exception. błędu:
Na przykładzie z listingu 3 (patrz CD) przeanalizujemy zastosowanie
wyjątków. Stworzyłem prostą klasę MojaKlasa zawierającą dwie metody: else
GetYear() i SetYear(), oraz jedną właściwość $Year. Naszym zadaniem jest {
sprawdzenie poprawności parametru metody SetYear() parametr ten po- throw new Exception( Rok musi zawierać się między
winien przyjmować wartości od 2003 do 2005. 2003 a 2005 , 0 );
}
if ( $ _year > 2003 && $ _year <= 2005 )
{ Metody SetYear() oraz GetYear() umieszczamy w bloku kodu try. W
$this->Year = $ _year; tym miejscu PHP5 czeka na wystąpienie błędu (a dokładnie na utworze-
} nie nowego obiektu klasy Exception). Jeżeli cała operacja przebiegnie
bezbłędnie, nic się nie stanie (tzn. wykonane zostaną powyższe metody
Jeżeli będzie inaczej, poinformujemy o tym użytkownika stosownym i wyświetlona zawartość pola Year), w przeciwnym wypadku wykonane
komunikatem. Gdy parametr tej metody przyjmie wartość mniejszą od zostaną instrukcje zawarte w bloku kodu catch. W naszym przypadku wy-
2003, spowodujemy stworzenie wyjątku, przypisując mu poniższy komu- świetlimy szczegółowe informacje na temat powstałego błędu:
nikat oraz numer błędu:
catch ( Exception $e )
elseif ( $ _year < 2003 ) {
{ echo Błąd nr . $e->getCode() . . $e->
throw new Exception( Rok nie może być mniejszy od getMessage();
2003 , 1 ); echo ( . $e->getFile() . linia . $e->
} getLine() . ) ;
}
Podobnie zabezpieczymy się w przypadku, gdy parametr metody przyj-
mie wartość większą od 2005: Zapytacie: skąd mamy wziąć informacje na temat tego błędu? Tu przy-
chodzi z pomocą wspomniana klasa Exception. Można oczywiście napisać
własną klasę obsługującą wyjątki, ale po co wyważać otwarte drzwi.
W zasadzie zaleca się do obsługi wyjątków używanie klasy Excep-
Specyfikacja klasy Exception
tion, a w przypadku chęci jej rozbudowy, stworzenie na jej podstawie
Konstruktor klasy potomnej. Nam jednak w zupełności ona wystarczy. W ramce
_construct(string $message=NULL, Tworzy nowy obiekt klasy
obok znajdują się dostępne pola oraz metody klasy Exception. Listing
int code=0) Exception generując domyślnie
3 obrazujący całość zagadnienia jest dostępny na CD.
komunikat Unknown exception
oraz kod błędu równy 0
(w naszym przykładzie
samodzielnie określamy przy
tworzeniu obiektu komunikat
oraz kod błędu).
Pola klasy
protected $message = Unknown Pole przechowujące komunikat
exception błędu (domyślnie przyjmuje
wartość Unknown exception ).
protected $code = 0 Pole przechowujące kod błędu
(domyślnie przyjmuje wartość 0).
protected $fi le Pole przechowujące ścieżkę
Rys. 3. Wystąpienie wyjątku w aplikacji
dostępu oraz nazwę pliku,
w którym wystąpił błąd.
Elementy wspomagające obsługę obiektów
protected $line Pole przechowujące nr linii
Dodatkowo w PHP5 znalazło się kilka elementów pomocnych w ob-
w pliku, w którym wystąpił błąd.
słudze obiektów. Można na przykład określić, że argumentem jakiejś
Metody klasy
metody ma być obiekt danej klasy (tzw. type hinting):
getMessage() Metoda zwracająca zawartość
pola $message;
getCode() Metoda zwracająca zawartość
pola $code;
class MojaKlasa
getFile() Metoda zwracająca zawartość
{
pola $file;
//kod klasy MojaKlasa
getLine() Metoda zwracająca zawartość
}
pola $line;
INTERNET.luty.2004
98
warsztat programy magazyn firma z okładki newsy co na cd indeks
PHP
class InnaKlasa
{
public function Konwertuj(
MojaKlasa $obiekt )
{
//kod metody Konwertuj
}
}
$obiekt1 = new InnaKlasa();
$obiekt2 = new MojaKlasa();
$obiekt1->Konwertuj( $obiekt2 );
?>
Ze względu na to, że dostęp do obiektu jest
realizowany poprzez uchwyt, straciliśmy na-
turalną metodę pozyskiwania kopii danego
obiektu. Dodatkowo, PHP4 nie umożliwiał
w żaden sposób użycia konstruktora kopiujące-
go. W PHP5 dostępna jest teraz metoda __clo-
ne(), która nie tylko umożliwia stworzenie du-
plikatu danego obiektu, ale dodatkowo pozwala
Rys. 4. Wykorzystanie konstruktora kopiującego (a)
na zdefiniowanie wartości poszczególnych pól
oraz stałych wewnątrz klasy (b)
tej klasy w skopiowanym obiekcie. Jeżeli taka
metoda została zdefiniowana w definicji klasy,
jest ona wywoływana w momencie skopiowania obiektu. Jeżeli natomiast
programista nie zdefiniował takiej metody, wywoływana jest domyślna
jej postać, która ma za zadanie skopiować do nowego obiektu zawartość
wszystkich pól. Całość ilustruje listing 4 patrz CD.
Rys. 5. Implementacja metod __get(), __set() oraz __call()
Wprowadzono również możliwość defi stałych wewnątrz
niowania
klasy: pola
$name! ;
}
class MojaKlasa
{ function _ _set( $name, $value )
const Stala = Stała wartość ; {
} echo Nastąpiła próba przypisania do
nieistniejącego pola
$name wartości
echo Wartość stałej
Stala klasy
Moja $value!
;
Klasa:
. MojaKlasa::Stala . ; }
oraz obsługę próby dostępu bądz przypisania wartości do nieistniejącego function _ _call( $name, $value )
pola klasy. W tym celu należy tylko zdefi następujące metody: {
niować
__get() oraz __set(). Jeśli odwołamy się do pola, które nie istnieje, zosta- echo Nastąpiła próba wywołania nieistniejącej
nie automatycznie wywołana metoda __get(), a gdy spróbujemy przypisać metody
$name z argumentami:
;
jakąś wartość nieistniejącemu polu klasy, wywołana zostanie metoda var _ dump( $value );
__set(). Do obsługi nieistniejących metod klasy wykorzystać można }
metodę __call(): }
$obiekt->y = 15;
echo
Obsługa nieistniejących pól echo Oto pole: . $obiekt->z .
;
i metod w PHP5 metody _ _set(), _ _ get() echo Oto metoda: . $obiekt->Ustaw( Styczeń , 5,
oraz _ _call()
; TRUE ) .
;
class MojaKlasa ?>
{
public $x; Artykuł ten opisuje właściwości PHP5 w wersji beta. Przypuszczalnie
więc w oficjalnej wersji twórcy PHP na pewno czymś nas jeszcze zaskoczą
function _ _ get( $name ) czymś pozytywnym oczywiście. Ale nawet biorąc pod uwagę tylko te
{ zmiany, które tu opisałem, można stwierdzić, że piątka będzie na piątkę.
echo Nastąpiła próba wywołania nieistniejącego
INTERNET.luty.2004
99
Wyszukiwarka
Podobne podstrony:
Technologie ADOdb kluczem do każdej bazy Jak pisać uniwersalne skrypty PHP 08 2004PHP Co nowego w PHP 5 (cz 3) 11 2004co nowegona co nalezy zwrocic uwage przygotowujac uczniow do nowego ustnego egzaminu maturalnegoiso 9000 co nowegoCO ROZPOZNAJE UKŁAD IMMUNOLOGICZNY NA DRODZE DO NOWEGO PARADYGMATUCo nowegoCO NOWEGOCzastki Modelu Standardowego co nowego29 Co nowego w znieczuleniu wziewnym 09 Smiechowicz KDGP 15 co nowego w prawie antymonopolowymSandvik Narzędzia obrotowe Co nowego 2012Co nowego wniosła do Twojej wiedzy o faszyzmie lektura Rozmowy z katemplastyka co nowegowięcej podobnych podstron