r03_t.pdf

(219 KB) Pobierz
Oto przyk³ady stylów nag³ówków:
Rozdział 3
Zaprzęgamy PHP do pracy
W niniejszym rozdziale omówimy następujące tematy:
Wprowadzenie do funkcji – esencji dobrego kodu PHP wielokrotnego użytku.
Przekazywanie danych do i z, do wewnątrz i na zewnątrz funkcji.
Tworzenie odwołań kodu do funkcji; dołączanie plików zewnętrznych.
Aplikacja wielokrotnego użytku Tell-a-Friend .
Dotychczas pisaliśmy nasze skrypty w sposób monolityczny. Mówiąc najkrócej, oznacza to, że całość kodu była
umieszczana wewnątrz tej samej sekcji, tego samego skryptu. Rozwiązanie takie jest wystarczające w przypadku
niewielkich skryptów, jakimi zajmowaliśmy się dotychczas, ale gdy zaczniemy opracowywać większe skrypty,
czy nawet tworzyć całe witryny, powstające w ten sposób kody byłyby rozwlekłe, trudne w obsłudze i
nadawałyby się jedynie do jednorazowego użycia.
Unikanie za wszelką cenę tych trzech pułapek jest cechą dobrego programisty PHP; rozpoczynając więc
niniejszy rozdział poświęćmy chwilę czasu na wyjaśnienie, dlaczego.
Rozwlekły kod. Słowo „rozwlekły” (ang. redundant ) jest często używane w stosunku do
niewłaściwych praktyk programistycznych i stosuje się je w wielu różnych znaczeniach, przekazując
różnego typu uwagi. W naszych rozważaniach odnosi się ono do niepotrzebnego powtarzania
fragmentów kodu w skrypcie.
Kod niesterowalny. Inną przesłanką przemawiającą przeciw rozwlekaniu kodu jest możliwość
uczynienia go niemożliwym do sterowania. Odwołując się do poprzedniego przykładu skryptu, którego
działanie polegało na zatwierdzaniu nazw i haseł użytkowników w kilku punktach, wyobraźmy sobie
sytuację, w której konieczna stałaby się zmiana sposobu zatwierdzania hasła – należałoby wówczas
przejrzeć cały kod, modyfikując każde wystąpienie kodu weryfikacyjnego. Kod niesterowalny jest
kodem niemożliwym do konserwacji i należy się takiego kodu wystrzegać!
Kod jednorazowego użytku. Posługując się nadal ostatnim przykładem, wyobraźmy sobie, że musimy
nasza witryna składa się z kilku skryptów, które wymagają przeprowadzenia takiej samej weryfikacji
nazwy i hasła użytkownika. Każdy z nich musiałby wykonać więc kod weryfikacyjny, czyniąc go
zarówno rozwlekłym, jak i niesterowalnym.
My oczywiście chcemy trzymać się jak najdalej od tych koszmarów programistycznych. Na szczęście, PHP
umożliwia użytkownikowi definiowanie własnych funkcji, dzięki czemu musi on jedynie napisać kod dla
określonego zadania, tworząc w skrypcie odwołania. PHP pozwala także na umieszczanie kodu w plikach
zewnętrznych, co oznacza możliwość przechowywania kodu wspólnego dla wielu skryptów w pojedynczym,
osobnym pliku.
Skoro już omówiliśmy i zrozumieliśmy trio największych błędów w pisaniu kodu, należy zająć się tym, co
stanowi naszą najlepszą metodą przed nimi – funkcjami. Mówiąc najprościej, funkcje to niewielkie fragmenty
kodu, które raz zdefiniowane, mogą być wywoływane w każdej chwili, gdy tylko są potrzebne.
Funkcje w PHP działają tak samo, jak ich kuzynki w ActionScript – podobna jest również składnia
obowiązująca podczas ich tworzenia i wywoływania. Podobieństwa te wynikają, wierzmy lub nie, ze wspólnych
korzeni PHP i ActionScript — tkwiących w języku C!
Na wypadek, gdyby ktoś z nas nie miał dotychczas do czynienia z funkcjami w ActionScript, czy jakimkolwiek
innym języku programowania, poświęcimy jeden lub dwa akapity na omówienie istoty funkcji i sposobów, w
jakie możemy je wykorzystać.
1
Wprowadzenie do funkcji
Funkcje umożliwiają dzielenie monolitycznych skryptów na części, których zrozumienie i modyfikowanie jest
łatwiejsze, rozkładając tym samym duże problemy na mniejsze. W ten sposób skrypty stają się klarowniejsze,
unika się duplikowania kodu, a edycja skryptów jest łatwiejsza.
To jest podstawa dobrego projektu. Po rozłożeniu głównego zagadnienia na mniejsze, łatwiej jest wskazać
powtarzające się fragmenty, które można przekształcić w funkcje.
No dobrze, wiemy już czym funkcje są w teorii, aby jednak wyjaśnić powody, dla których są one tak użyteczne,
odwołajmy się jeszcze raz do osobistych doświadczeń i opowieści o skuterach, żółtych karteczkach i
zapominalstwie...
Jestem posiadaczem motocykla. Jest to jedynie Peugeot Speedfight 100, ale wystarcza by przejechać z miejsca
A do miejsca B (czasem objazdem przez C). Doprowadzam nim kierowców stojących w korkach do
wściekłości, gdy przemykam pomiędzy ich samochodami – co sprawia mi największą satysfakcję! W każdym
razie, wciąż gubię kluczyki do mojego skutera, co kończy się zazwyczaj całodziennym ich poszukiwaniem.
Mógłbym rozwiązać ten problem, zamawiając 20 kopii kluczyków i rozwieszając je w różnych miejscach domu
– miałbym wówczas pewność, że po kilku minutach poszukiwań znajdę którąś z nich. Jeśli jednak musiałbym
zmienić kluczyki (na przykład, zakupując piękny nowy skuter Ducatti 1100), konieczne byłoby sporządzenie 20
nowych kopii.
Lepszym rozwiązaniem byłoby pozostanie przy jednym komplecie kluczyków i regularne pozostawianie ich na
haczyku przy drzwiach wyjściowych. Wtedy, wystarczyłoby porozklejać w całym domu karteczki,
przypominające o tym, gdzie wiszą kluczyki. Tym sposobem, znajdując jedną z karteczek, mógłbym skierować
się bezpośrednio do drzwi, gdzie z pewnością znalazłbym kluczyki. Nawet gdybym zmienił kluczyki, nie
musiałbym zmieniać karteczek, ponieważ zapisana na nich informacja o miejscu pozostawienia kluczyków
byłaby wciąż aktualna!
Podstawową ideą zastosowania funkcji jest przechowywanie fragmentów kodu o określonych zadaniach
(kluczyki), w jednym miejscu i odwoływanie się do nich z wewnątrz skryptu (przyklejane karteczki).
Skoro wiemy już, co robią funkcje (a także, jaki skuter posiadam), przyjrzyjmy się jak działają. Oto procedura
tworzenia funkcji w PHP:
function functionName([parameters]) {
statements
}
Podobnie, jak w przypadku wielu innych elementów języka PHP, z którymi spotykaliśmy się do tej pory,
składnia obowiązująca podczas tworzenia funkcji jest taka sama, jak w ActionScript i dlatego użytkownikom
Flasha powinna być znana.
Prosta funkcja w PHP może mieć następującą postać:
function outputName() {
echo „My name is Steve Webster.”;
}
echo „I’ll tell you my name.<br>\n”;
outputName();
Funkcja ta nie jest, oczywiście, zbyt użyteczna, gdyż wszystko co potrafi, to wyświetlenie nazwiska. Niemniej
jednak daje nam uproszczony obraz rzeczywistej funkcji PHP. Ostatni wiersz powyższego kodu jest przykładem
wywołania funkcji. Następuje ono poprzez nazwę nadaną funkcji we wcześniejszej części skryptu, uzupełnioną
parą nawiasów i średnikiem umieszczonym na końcu wiersza.
Po wywołaniu funkcji, wykonanie jej rozpoczyna się od pierwszej instrukcji. Instrukcje zawarte wewnątrz
funkcji wykonywane są w typowy sposób, do końca funkcji lub napotkania słowa kluczowego return . W tym
punkcie skrypt powraca do pierwszej instrukcji za wywołaniem funkcji.
Można to porównać do objazdu poprzez punkt C, na drodze pomiędzy punktami A i B kodu skryptu czy strony.
Gdy interpreter PHP napotyka funkcję, kieruje się okrężną drogą, wykonując instrukcje zawarte w funkcji, po
czym, po ich wykonaniu powraca na stare szlaki, zajmując się resztą strony.
Mechanizm ten można zilustrować poniższym diagramem.
2
Zasięg zmiennych
Wprowadzając funkcje do skryptów, napotykamy kwestię zasięgu zmiennych. Zasięg zmiennej decyduje o tym,
które części skryptu mają do niej dostęp.
Do chwili obecnej, wszystkie zmienne, z jakich korzystaliśmy, były zmiennymi globalnymi, co oznacza ich
dostępność z dowolnego punktu skryptu. Jednakże zmienne tworzone wewnątrz funkcji mają zasięg
ograniczony i dostęp do nich można uzyskać jedynie w obrębie funkcji, a w związku z tym zmienne te określa
się jako lokalne.
Co więcej – choć mogłoby się tak wydawać – zmienne egzystujące na zewnątrz funkcji (zmienne globalne) nie
są udostępniane naszym funkcjom. Ma to na celu zapobieżenie komplikacjom, jakie niesie automatyczne
tworzenie zmiennych globalnych z danych przekazywanych metodami GET i POST .
Nie-globalną postać zmiennych globalnych można przedstawić na przykładzie poniższego kodu:
<?
function increment() {
$number++;
}
$number = 1;
echo $number . "<br>"; // Will print 1
increment();
echo $number . "<br>"; // Will print 1
?>
Ponieważ zmienna $number nie jest widoczna z wewnątrz funkcji increment , nie ulega inkrementacji, jak
można byłoby się spodziewać. Zamiast tego, wewnątrz funkcji increment tworzona jest nowa, lokalna
zmienna $number i to ona jest inkrementowana, podczas gdy zmienna globalna pozostaje bez zmian!
Jednak nie wszystko stracone, a dostęp do zmiennych globalnych z funkcji można uzyskać poprzez
zdefiniowanie ich wewnątrz funkcji, poprzedzając nazwy słowem kluczowym global . Aby skorzystać z takiej
możliwości, moglibyśmy użyć poprzedniego kodu, poddając go modyfikacjom:
<?
function increment() {
global $number;
$number++;
}
$number = 1;
echo $number . „<br>”;
// Will print 1
increment();
echo $number . “<br>”;
// Will print 2
?>
Dostęp do zmiennej globalnej można uzyskać także za pomocą wbudowanej tablicy $GLOBALS . Tablica ta
przechowuje wszystkie zmienne globalne skryptu i umożliwia manipulowanie nimi, bez konieczności używania
słowa kluczowego global .
<?
function increment() {
$GLOBALS[‘number’]++;
}
$number = 1;
echo $number . „<br>”;
// Will print 1
increment();
echo $number . “<br>”;
?>
// Will print 2
3
Oczywiście, te przykładowe funkcje nie muszą być użyteczne, ale ich zadaniem jest wyłącznie zilustrowanie
technik, które musimy poznać jako programiści PHP.
Czas życia zmiennych
Jak wszystkie rzeczy na naszej wspaniałej planecie, tak i zmienne mają swój czas życia, a gdy dobiega on końca,
zmienne przestają istnieć. Jednakże, w przeciwieństwie do mieszkańców Ziemi, o długości życia zmiennej
decyduje nie upływ czasu, ale to kiedy znajdzie się ona poza zasięgiem.
Zrozumienie tej zasady będzie łatwiejsze, jeśli przyjrzymy się poniższemu kodowi:
<?
function updateCount() {
$count++;
print „Count: $count<br>\n”;
}
updateCount(); // Will print “Count: 1”
updateCount(); // Will print “Count: 1”
?>
Przyglądając się powyższemu kodowi widzimy, że bez względu na to, ile razy wywołamy funkcję
updateCount , wynik będzie zawsze taki sam. Może nam się to wydać nieco dziwne, ale tylko do momentu,
gdy zwrócimy uwagę na lokalną zmienną $count , która na końcu funkcji updateCount traci zasięg i ginie.
Wraz z ponownym wywołaniem funkcji, powstaje nowa zmienna $count .
Możliwe jest wymuszenie zapamiętania przez PHP wartości określonych zmiennych, poprzez zdefiniowanie ich
nazw z dodanym słowem kluczowym static .
<?
function updateCount() {
static $count = 0;
$count++;
print „Count: $count<br>\n”;
}
updateCount(); // Will print “Count: 1”
updateCount(); // Will print “Count: 2”
?>
W powyższym kodzie widać, że tym razem $count zachowuje swoją wartość pomiędzy kolejnymi
wywołaniami funkcji (mimo, iż wciąż pozostaje ona zmienną lokalną, niedostępną z zewnątrz funkcji). Podczas
pierwszego wywołania updateCount następuje inicjalizacja $count z początkową wartością 0, ale w
kolejnych wywołaniach inicjalizacja ta umiera. Jednakże musimy pamiętać, że statyczna obecnie zmienna
$count zachowuje swą wartość jedynie na czas działania całego skryptu. Jeśli skrypt zostanie uruchomiony
ponownie, wówczas zmienna $count znów zostanie zainicjalizowana z wartością 0.
Przekazywanie danych do funkcji
Powyższy przykład zaprezentował prostą funkcję, nie pobierającą żadnych argumentów. Choć funkcja taka
może być użyteczna, właściwy użytek z funkcji można zrobić dopiero wtedy, gdy istnieje możliwość
przekazania jej informacji.
Przekazywanie argumentów, to nic innego, jak przekazywanie informacji. Zmienne wymienione w definicji
funkcji określane są jako parametry i informują one PHP, jakiego rodzaju informacji dana funkcja oczekuje.
Podczas wywołania funkcji w skrypcie, dane są jej przekazywane w postaci argumentów (jest to inne określenie
fragmentów kodu ujętych w nawiasy).
Do przekazywania informacji korzystamy z sekcji parametrów definicji funkcji. Tutaj, podobnie jak w
ActionScript, należy jedynie wylistować informacje, jakie chcemy przekazać w formie nazw zmiennych. Nazw
tych możemy używać wewnątrz funkcji do odwoływania się do przykazywanych informacji.
4
<?
function outputDetails($name, $jobTitle, $age) {
print "Your name is $name, you are a $jobTitle and you are $age years old<br>\n";
}
outputDetails("Steve Webster", "PHP Guru", 22);
outputDetails("Alan McCann", "Content Architect", 23);
?>
Korzyści z możliwości przekazywania funkcjom danych możemy zauważyć, przyglądając się uważnie
powyższemu kodowi. Poprzez uzależnienie wyniku wyjściowego od argumentów funkcji, możemy zmieniać ów
wynik, modyfikując argumenty przekazywane funkcji podczas jej wywoływania.
Zwracanie danych przez funkcje
Podobnie, jak możliwe jest przekazywanie funkcjom danych, również możliwe jest ich pobieranie z funkcji.
Służy do tego słowo kluczowe return , po którym określa się wartość (lub nazwę przechowującej ją
zmiennej), którą chcemy otrzymać.
Na przykład, funkcja obliczająca kwadrat liczb mógłby wyglądać następująco:
<?
function square($number) {
return $number * $number;
}
echo “4 squared = “ . square(4) . “<br>\n”; // 16
echo “10 squared = “ . square(10) . “<br>\n”; // 100
?>
Funkcja square pobiera dane przekazywane za pośrednictwem parametru $number , oblicz kwadrat liczby,
mnożąc ją przez nią samą, po czym zwraca rezultat. Oznacza to możliwość przekazania tej funkcji dowolnej
liczby, dla której obliczona zostanie druga potęga.
Słowo kluczowe return można zastosować w dowolnym miejscu funkcji, powodując jej przerwanie w danym
miejscu. Ponadto, funkcja może zawierać wiele instrukcji return i możliwość ta jest często wykorzystywana
wraz z instrukcją selekcji, w celu określenia, czy operacja zakończyła się sukcesem czy też niepowodzeniem.
Jednak z uwagi na fakt, że wykonywanie funkcji ulega przerwaniu w chwili napotkania słowa kluczowego
return , liczba aktywnych instrukcji return w funkcjach ograniczona jest do jednej, w związku z czym
zwracana jest tylko jedna wartość. Aby obejść to ograniczenie, w charakterze wartości zwracanej możemy użyć
tablicy, co pozwala uzyskiwać więcej wartości zwrotnych niż tylko jedną. Na przykład, funkcja podwajająca i
obliczająca kwadrat argumentu mogłaby mieć następującą postać:
<?
function doubleAndSquare($number) {
$returnArray['double'] = $number * 2;
$returnArray['squared'] = $number * $number;
}
$values = doubleAndSquare(5);
print "Doubled: " . $values['double'] . "\n"; // 10
print "Squared: " . $values['squared'] . "\n"; // 25
?>
Za pomocą tej techniki możemy z funkcji uzyskać tyle wartości, ile tylko będzie możliwe. Jednakże, zwracanie
danych w formie tablicy nie zawsze bywa praktyczne. W kolejnym podrozdziale omówimy sposób
zewnętrznego udostępniania danych pochodzących z wewnątrz funkcji.
Przekazywanie danych poprzez odwołania
5
Zgłoś jeśli naruszono regulamin