Technologie internetowe server-side na przykładzie języka PHP
Spis treści 1 Czym jest PHP? 2 2 Co potrafi PHP? Niektóre z zalet języka. 3 3 Instalacja PHP i serwera WWW Apache 5 3.1 Instalacja na platformie MS Windows...................... 5 3.2 Instalacja na platformie Linux.......................... 7 4 Podstawowy kurs języka PHP 8 4.1 Osadzanie skryptu PHP w kodzie HTML.................... 8 4.2 Oddzielanie instrukcji............................... 9 4.3 Komentarze.................................... 9 4.4 Typy danych PHP................................ 10 4.5 Zmienne...................................... 12 4.6 Rzutowanie typów................................ 13 4.7 Przypisanie wartości do zmiennych....................... 13 4.8 Zasięg zmiennych................................. 14 4.9 Zmienne zmienne................................. 16 4.10 Testowanie i ustawianie typów zmiennych.................... 16 4.11 Stałe........................................ 18 4.12 Operatory..................................... 19 4.13 Priorytety operatorów.............................. 21 4.14 Struktury warunkowe............................... 22 4.15 Instrukcje iteracyjne............................... 25 4.16 Składnia alternatywna wyrażeń......................... 27 5 Tablice 28 5.1 Tworzenie za pomocą array().......................... 28 5.2 Tworzenie i edytowanie składnią nawiasów kwadratowych........... 28 5.3 Tablice wielowymiarowe............................. 29 6 Funkcje 30 6.1 Argumenty funkcji................................ 31 6.2 Zwracane wartości................................ 32 7 Wielokrotne wykorzystywanie kodu 32 2
8 Zmienne spoza PHP 34 8.1 Predefiniowane tablice superglobalne...................... 34 8.2 Formularze HTML (GET i POST)....................... 35 8.3 Ciasteczka HTTP................................. 38 8.4 Przesyłanie plików metodą POST........................ 39 9 HTTP - obsługa protokołu 41 10 Formatowanie czasu i daty 43 11 Wysyłanie poczty elektronicznej za pomocą PHP 46 12 Obsługa zmiennych tablicowych 48 13 Funkcje do obsługi systemu plików 48 14 Łańcuchy znaków 48 15 Wyrażenia regularne 48 16 Dostęp do systemu MySQL z poziomu PHP 50 17 Obsługa sesji 50 18 Zasoby sieciowe związane z językiem PHP 53
1 Czym jest PHP? 1 Czym jest PHP? PHP jest językiem skryptowym wykonywanym po stronie serwera. Został on zaprojektowany specjalnie w celu tworzenia aplikacji sieci Web. Kod PHP można umieszczać wewnątrz kodu HTML i będzie on wykonywany przy każdorazowym otwarciu danej strony. Kod ten jest interpretowany przez serwer WWW, w wyniku czego generowany jest kod HTML lub inne dokumenty. Spójrzmy na następujący prosty przykład skryptu w PHP: <html> <head> <title>przykład</title> </head> <body> <?php echo "Cześć! Jestem skryptem PHP!";?> </body> </html> PHP różni się od skryptów wykonywanych po stronie klienta, takich jak np. JavaScript tym, że cały kod PHP wykonywany jest na serwerze. Jeśli mamy na serwerze skrypt podobny do przedstawionego wyżej, klient dostanie tylko rezultat wykonania skryptu, bez możliwości stwierdzenia jak wygląda generujący go kod. W naszym przypadku będzie to: <html> <head> <title>przykład</title> </head> <body> Cześć! Jestem skryptem PHP! </body> </html> Można nawet skonfigurować serwer WWW, tak aby wszystkie pliki HTML były przetwarzane przez PHP. Język PHP został wymyślony w roku 1995 przez Rasmusa Lerdorfa. Od tego czasu kod języka był wielokrotne przepisywany i modyfikowany, w efekcie czego stał się produktem profesjonalnym szeroko wykorzystywanym przez programistów tworzących aplikacje WWW. Według statystyk w styczniu 2001 roku język PHP był używany na blisko pięciu milionach domen, liczba ta szybko rośnie. Strona http://www.php.net/usage.php zawiera aktualne dane na ten temat. 2
2 Co potrafi PHP? Niektóre z zalet języka. PHP to produkt Open Source, każdy ma więc dostęp do kodu źródłowego, który można dowolnie modyfikować i rozpowszechniać, bez ponoszenia jakichkolwiek opłat (pod warunkiem, że również udostępnimy kod źródłowy). Nazwa języka stanowi skrót od słów Personal Home Page, lecz zgodnie z konwencją nazewniczą obowiązującą dla produktów GNU (GNU to skrót od słów Gnu s Not Unix - Gnu to nie Unix - projekt bezpłatnego systemu operacyjnego, zgodnego funkcjonalnie z systemem Unix) jest obecnie rozwijany jako PHP Hypertext Preprocessor. 2 Co potrafi PHP? Niektóre z zalet języka. PHP jest rozwijane pod kątem pisania skryptów server-side, więc za jego pomocą można zrobić wszystko co potrafią inne programy CGI, jak na przykład odbierać dane z formularzy, generować dynamicznie zawartość strony, lub odbierać i wysyłać ciasteczka. Ale PHP może o wiele więcej. Do trzech głównych obszarów użytkowania skryptów PHP należą: 1. Tworzenie skryptów server-side. Jest to najbardziej tradycyjne i główne pole działania PHP. Potrzebujemy do tego trzech rzeczy: parsera PHP (plik wykonywalny CGI lub moduł serwera), serwera WWW i przeglądarki. Musimy uruchomić serwer WWW połączony z PHP. Dane wyjściowe programów PHP możemy oglądać korzystając z przeglądarki poprzez serwer. 2. Pisanie skryptów uruchamianych z linii poleceń. Możemy napisać skrypt PHP i uruchomić go bez serwera i przeglądarki. Potrzebujemy do tego tylko parsera PHP. Ten typ użytkowania jest idealny do uruchamiania skryptów regularnie poprzez crona (systemy Uniksowe) lub menedżer zadań (systemy Windows), lub do przetwarzania tekstu. 3. Pisanie aplikacji client-side z interfejsem użytkownika. PHP jest prawdopodobnie nienajlepszym językiem do pisania okienkowych aplikacji, ale jeśli bardzo dobrze znamy PHP i chcemy skorzystać z zaawansowanych możliwości PHP w swojej aplikacji client-side, możemy użyć pakietu PHP-GTK do pisania takich programów. Z PHP-GTK mamy także możliwość pisania aplikacji wieloplatformowych. PHP-GTK jest rozszerzeniem PHP i nie jest dostępne w głównej dystrybucji. Oficjalna witryna PHP-GTK to http://gtk.php.net. Najwięksi konkurenci języka PHP to Perl, Microsoft Active Server Pages (ASP), Java Server Pages (JSP) oraz Allaire Cold Fusion. W porównaniu do konkurencji, PHP posiada wiele zalet, a między innymi: 3
2 Co potrafi PHP? Niektóre z zalet języka. Jest wydajny. Korzystając z pojedynczego, niedrogiego serwera, można obsługiwać miliony "trafień" dziennie. Testy wydajności możemy znaleźć na stronie firmy Zend Technologies (http://zend.com). Jest wieloplatformowy i przenośny. PHP może być użyty w większości najważniejszych systemów operacyjnych, takich jak Linux, wiele wariantów systemu Unix (włączając w to HP-UX, Solaris i OpenBSD), Microsoft Windows, Mac OS X, RISC OS i prawdopodobnie wiele innych. PHP w chwili obecnej obsługuje większość serwerów HTTP, włączając w to Apache, Microsoft Internet Information Server, Personal Web Server, serwery Netscape i iplanet, Oreilly Website Pro, Caudium, Xitami, OmniHT- TPd i wiele innych. Dla większości z nich PHP dostępne jest jako moduły serwera, dla pozostałych jako program CGI. Kod przenoszony pomiędzy różnymi systemami, zazwyczaj działa prawidłowo bez jakichkolwiek modyfikacji. Obsługuje wiele baz danych. Jedną z najmocniejszych i najbardziej znaczących możliwości PHP jest obsługa wielu rodzajów baz danych. Pisane strony WWW wykorzystującej bazę danych jest niewiarygodnie proste. Obecnie obsługiwane są następujące bazy danych: Adabas D, Ingres, Oracle (OCI7 i OCI8), dbase, InterBase, Ovrimos, Empress, FrontBase, PostgreSQL, FilePro (tylko do odczytu), msql, Solid, Hyperwave, Direct MS-SQL, Sybase, IBM DB2, MySQL, Velocis, Informix, ODBC, Unix dbm. Korzystając ze standardu ODBC (Open Database Conectivity), można się połączyć z dowolną bazą danych, do której istnieje sterownik ODBC. Wbudowane biblioteki. Możliwości PHP obejmują tworzenie obrazów, plików PDF, a nawet animacji Flash (używając libswf i Ming) generowanych "w locie". Możemy także wyprowadzać na wyjście dowolne dane tekstowe, jak na przykład XHTML czy dowolny inny plik XML-owy. PHP obsługuje również protokoły takie jak FTP, IMAP, SNMP, NNTP, POP3, HTTP. PHP ma niezwykle przydatne możliwości do obróbki tekstów m. in. POSIX owe i PERL owe wyrażenia regularne. Niskie koszty użytkowania i dostęp do kodu źródłowego. Jako produkt Open Source PHP jest dostępny za darmo wraz z kodem źródłowym. Prosta składnia. Jest ona oparta na innych językach programowania, a w szczególności na języku C i Perl. Jeśli programowaliśmy w językach wywodzących się z C, takich jak C++ czy Java, to nauka PHP nie sprawi nam kłopotu. 4
3 Instalacja PHP i serwera WWW Apache 3 Instalacja PHP i serwera WWW Apache Po pierwsze ściągamy najnowsze pakiety dla odpowiedniej platformy z następujących witryn: http://httpd.apache.org/ - strona serwera Apache, http://www.php.net - oficjalna witryna języka PHP, 3.1 Instalacja na platformie MS Windows Zaczynamy od instalacji serwera Apache. Instalacja nowszych wersji Apache a ogranicza się do kilku kliknięć myszą. Uruchamiamy instalatora i wybieramy składniki instalacji i wstępnie konfigurujemy serwer ustawiając: Network domain - domena sieci, jeżeli nie mamy własnej domeny ustawienia te nie mają wpływu na działanie naszego serwera i możemy wpisać dowolną nazwę np. domena.com (w naszym przypadku domena jest rozpoznana automatycznie); Server Name - nazwa serwera np. www.domena.com (jeśli nie ustawimy to domyślna nazwa to nazwa komputera); Administrators Email Address - tu możemy wpisać swój adres email, będzie on wyświetlany w podpisie serwera (server signature). Później wybieramy sposób uruchamiania serwera, odpowiadamy czy Apache ma się uruchamiać automatycznie przy starcie systemu, czy też będziemy uruchamiać go ręcznie. Proponujemy start jako System Service, wtedy serwer będzie pracował w tle, bez czarnego okienka Dos. Dodatkowo będziemy mieli opcje sterowania Apache czyli start, stop i restart. Następnie dochodzimy do wyboru ścieżki, gdzie zainstaluje się Apache. Domyślnie Apache instaluje się C:\Program Files\Apache Group jednak możemy tę ścieżkę zmienić. Teraz możemy sprawdzić, czy serwer został poprawnie zainstalowany. W tym celu uruchamiamy przeglądarkę i wpisujemy w pasku adresu "localhost" lub "127.0.0.1", czyli lokalny adres naszego komputera (adres pętli zwrotnej). Jeżeli instalacja przebiegła pomyślnie, powinniśmy zobaczyć ekran powitalny naszego serwera. Wszystkie strony, które będą obsługiwane przez nasz serwer muszą się znaleźć w katalogu C:\Program Files\Apache Group\apache\htdocs\ bądź w folderze C:\Program Files\Apache Group\apache\users\username 5
3 Instalacja PHP i serwera WWW Apache (w tym drugim przypadku aby "odpalić" stronę musimy wpisać adres http://localhost/~username/podkatalog/nazwapliku). Instalacja PHP. Rozpakowujemy binaria PHP do jakiegoś katalogu np. C:\php\. Po rozpakowaniu musimy skopiować plik php.ini-dist do katalogu windows (C:\windows\ lub C:\winnt\) i zamienić jego nazwę na php.ini. Następnie musimy skopiować plik php4ts.dll do katalogów C:\windows\system\ i C:\windows\system32\ to samo robimy z plikami z folderu C:\php\dlls\. Po skopiowaniu plików musimy zastanowić się jak chcemy zainstalować PHP. Mamy dwie możliwości: Instalację poprzez CGI. Instalację jako moduł serwera Apache. Aby zainstalować PHP w serwerze Apache musimy otworzyć plik konfiguracyjny Apacha (httpd.conf) w dowolnym edytorze tekstowym i w odpowiednich sekcjach dopisać poniższe linie: Dla instalacji jako CGI: ScriptAlias /php/ "c:/php/" AddType application/x-httpd-php.php.php3.phtml Action application/x-httpd-php "/php/php.exe"} Dla instalacji jako modułu serwera: LoadModule php4_module /php/sapi/php4apache.dll ScriptAlias /php/ "c:/php/" Action application/x-httpd-php "/php/php.exe" AddType application/x-httpd-php.php.php3.phtml} To wystarczy do tego, aby serwer interpretował pliki z rozszerzeniem *.php, *.php3, *.phtml jako pliki PHP, a jeżeli chcemy, aby domyślnym plikiem katalogu był plik o nazwie index.<nasze\_rozszerzenie> musimy dopisać jeszcze w odpowiedniej sekcji linijkę: DirectoryIndex index.<nowe\_rozszerzenie> Teraz pozostało nam zapisanie zmian w pliku httpd.conf i zrestartowanie serwera, aby zobaczyć, czy PHP prawidłowo interpretuje pliki i odpowiednio je parsuje. Najprostszym sposobem na sprawdzenie, czy PHP działa jest stworzenie pliku, np. test.php, w którym będzie się znajdowała jedna linijka kodu: <? phpinfo();?> 6
3 Instalacja PHP i serwera WWW Apache Teraz otwieramy przeglądarkę i wpisujemy w pasku adresu http://localhost/test.php. Jeżeli wszystko jest w porządku oczom naszym ukaże się strona w wieloma tabelami, w których znajdować się będą informacje o zainstalowanych wersjach PHP i Apache. 3.2 Instalacja na platformie Linux Do instalacji potrzebne są następujące narzędzia: gzip lub gnuzip; gcc i GNU make; źródła oprogramowania Apache i PHP; uprawnienia użytkownika root. W typ przypadku zainstalujemy oprogramowanie w następujących katalogu /usr/local/apache. PHP wymaga, aby serwer Apache był już wstępnie skonfigurowany, w tym celu wykonujemy następujące polecenia: #tar zxvf apache_x.x.x.tar.gz #cd apache_x.x.x #./configure --prefix=/usr/local/apache Teraz możemy już przystąpić do instalacji PHP: #tar zxvf php-x.x.x.tar.gz #cd php-x.x.x #./configure --with-mysql --with-apache=../apache_x.x.x Następnie kompilujemy i instalujemy binaria: #make #make install Ostatnim krokiem jest konfiguracja i instalacja serwera Apache: #cd../apache_1.3.x #./configure --activate-module=src/modules/php4/libphp4.a --enable-module=php4 --prefix=/usr/local/apache #make #make install 7
4 Podstawowy kurs języka PHP Jeszcze musimy tylko wyedytować plik httpd.conf dopisując następujące wiersze: AddType application/x-httpd-php.php AddType application/x-httpd-php-source.phps 4 Podstawowy kurs języka PHP W tej części nauczymy się elementarnej składni języka. 4.1 Osadzanie skryptu PHP w kodzie HTML Jeśli chcemy wstawić komendy PHP w jakimś miejscu w swoim dokumencie musimy to zasygnalizować, wchodząc w "tryb PHP" którymś ze sposobów podanych poniżej: Styl znaczników krótkich: <? echo "To jest test";?> Styl XML: <?php echo "Jeśli chcemy używać dokumentów XHTML i XML";?> Styl skryptowy(sposób przestarzały): <script language="php"> echo ("Niektóre edytory (jak FrontPage) nie lubią instrukcji wchodzących w tryb PHP "); </script> Styl ASP: <% echo ("Możemy także użyć znaczników w stylu ASP"); %> 8
4 Podstawowy kurs języka PHP Pierwszy sposób jest dostępny tylko kiedy zostały włączone krótkie znaczniki. Można to zrobić wpisując short_open_tag on do pliku konfiguracyjnego PHP albo przy kompilacji PHP dodając --enable-short-tags do configure. Drugi sposób jest preferowany, zapewnia on następnej generacji XHTML-a łatwą implementację w PHP. Czwarty sposób jest dostępny tylko kiedy znaczniki ASP zostały włączone poprzez uaktywnianie opcji konfiguracyjnej asp_tags. 4.2 Oddzielanie instrukcji Instrukcje są oddzielane tak samo jak w C czy Perlu - należy kończyć każde wyrażenie średnikiem. Znacznik zamykający (?>) także kończy instrukcję, więc poniższe przykłady są równoważne: <?php echo "To jest test";?> <?php echo "To jest test"?> 4.3 Komentarze PHP obsługuje komentarze w stylu C, C++ oraz komentarze używane w powłokach uniksowych (#): <?php echo "To jest test"; // to jest kometarz jednoliniowy w stylu C++ /* to jest komentarz wieloliniowy a tutaj inna komentowana linia */ echo "To jest jeszcze jeden test"; echo "Ostatni test"; # to jest kometarz w stylu shell a?> Komentarze typu jednoliniowego mają zasięg do końca linii, w której się znajdują lub do końca bloku kodu PHP, zależnie co wystąpi pierwsze. Powinniśmy uważać by nie zagnieżdżać komentarzy w stylu C++ (szczególnie komentarzy wieloliniowych), co może się stać kiedy komentujemy dłuższy blok kodu. 9
4 Podstawowy kurs języka PHP 4.4 Typy danych PHP PHP obsługuje osiem typów: Cztery skalarne: boolowski (boolean), liczba całkowita (integer), liczba zmiennoprzecinkowa (float), łańcuch znaków (string); Dwa typy złożone: tablica (array), obiekt (object); Oraz dwa typy specjalne: identyfikator zasobów (resource), NULL (null). Typ boolean wyraża logiczną prawdę lub fałsz. Może mieć wartości true lub false. Ten typ najczęściej używany jest przy operatorach, które zwracają wartość typu boolean, którą następnie przekazuje się do struktur kontrolnych. Typ integer to liczba całkowita, należąca do pewnego zbioru Z = {-n..., -2, -1, 0, 1, 2,...,n}. Liczby całkowite mogą być zapisane w notacji dziesiętnej (opartej na 10), szesnastkowej (opartej na 16) lub ósemkowej (opartej na 8), opcjonalnie poprzedzone znakiem (- lub +). Aby zapisać liczbę w notacji ósemkowej, należy poprzedzić właściwą liczbę symbolem 0 (zero). W notacji szesnastkowej liczbę należy poprzedzić symbolem 0x. Liczby zmiennoprzecinkowe (typ float, double ) mogą być zapisane przy użyciu dowolnej z poniższych składni: $a = 1.234; $a = 1.2e3; $a = 7E-10; 10
4 Podstawowy kurs języka PHP Maksymalna wielkość liczby zmiennoprzecinkowej jest zależna od platformy operacyjnej, zwykle jest to ±1.8e308, przy precyzji 14 liczb dziesiętnych po przecinku. Typ string oznacza łańcuch znaków. W PHP znak jest tym sam co bajt, co oznacza, że jest możliwych 256 różnych znaków. Uwaga! Nie ma technicznych problemów, które utrudniałyby tworzenie bardzo długich ciągów znaków. Nie ma też ustalonej maksymalnej długości łańcuchów znaków obsługiwanych w PHP, więc nie ma powodu do obaw, że dany łańcuch jest zbyt długi. Łańcuch znaków można utworzyć na trzy sposoby: przez pojedyncze cudzysłowy:, przez podwójne cudzysłowy ", za pomocą składni heredoc. Najprostszym sposobem na zdefiniowanie prostego łańcucha znaków, jest umieszczenie go w pojedynczych cudzysłowach (znak ). Aby w takim łańcuchu umieścić symbol pojedynczego cudzysłowu, należy go poprzedzić ukośnikiem wstecznym (\), tak jak w wielu innych językach programowania. Jeśli ukośnik wsteczny ma wystąpić przed symbolem pojedynczego cudzysłowu lub na końcu łańcucha, wtedy należy napisać go dwukrotnie. W przypadku użycia ukośnika wstecznego z innym znakiem, ukośnik też zostanie wyświetlony! Nie ma zatem potrzeby pisania ukośnika dwukrotnie w innych sytuacjach. Uwaga! W przeciwieństwie do dwóch pozostałych składni, zmienne nie będą zamienione na swoje wartości, kiedy pojawią się pomiędzy pojedynczymi cudzysłowami. Kiedy łańcuch znaków jest umieszczony pomiędzy podwójnymi cudzysłowami, PHP interpretuje więcej sekwencji cytowania dla znaków specjalnych: Sekwencja Znaczenie \n nowa linia (LF lub 0x0A (10) w ASCII) \r powrót karetki (CR lub 0x0D (13) w ASCII) \t tabulacja pozioma (HT lub 0x09 (9) w ASCII) \\ odwrotny ukośnik \$ znak dolara \" cudzysłów podwójny Tak jak w poprzedniej składni, zapisanie ukośnika wstecznego przed każdym innymi znakiem spowoduje wyświetlenie zarówno ukośnika, jak i znaku. Ale najważniejszą właściwością podwójnych cudzysłowów jest to, że zapisane w nich zmienne zostaną zamienione na ich wartości. 11
4 Podstawowy kurs języka PHP Jeszcze jednym sposobem na zapisanie łańcucha znaków jest użycie składni heredoc (<<<). Po operatorze <<< powinno się umieścić identyfikator i takim samym identyfikatorem trzeba zakończyć łańcuch znaków. Ważne by pamiętać, że linia zawierająca identyfikator zamykający nie może zawierać żadnych innych znaków, z wyjątkiem średnika. Znaczy to przede wszystkim, że identyfikator zamykający nie może być wcinany, i nie może być żadnych spacji ani tabulacji przed lub za średnikiem. Uwaga! Najbardziej dokuczliwym ograniczeniem jest to, że wewnątrz tego łańcucha znaków nie może być znaku powrotu karetki (\r) na końcu linii, jedynie znak nowej linii (\n). Ponieważ Microsoft Windows używa jako znaku końca linii sekwencji \r\n, łańcuchy znaków zapisane w składni heredoc mogą nie działać, jeśli skrypt zostanie napisany w edytorze windowsowym. Na szczęście większość edytorów tekstowych udostępnia możliwość zapisania pliku w uniksowym formacie końca linii. Składnia heredoc zachowuje się podobnie jak tekst w cudzysłowach podwójnych. W tej składni nazwa zmiennej zamieniana jest na jej wartość, ale należy zachować ostrożność przy zapisie złożonych zmiennych razem z tekstem. <?php $str = <<<EOD Przykład łańcucha znaków, zajmującego kilka linii, zapisanego w składni heredoc. EOD; Typy złożone: tablice (array) i obiekty (object) omówimy oddzielnie. Identyfikator zasobów jest specjalną zmienną, przechowywującą odnośnik do zewnętrznego źródła zasobów. Identyfikatory zasobów są tworzone i wykorzystywane przez specjalne funkcje. Specjalna wartość NULL oznacza, że zmienna nie przechowuje żadnej wartości. NULL jest jedyną możliwą wartością typu NULL. Uwaga! Typ NULL został wprowadzony w PHP 4. Wielkość liter słowa NULL nie gra roli. 4.5 Zmienne Każdą zmienną w PHP zapisuje się, poprzedzając jej nazwę znakiem dolara: $. Wielkość liter w nazwie zmiennej jest rozróżniana. Nazw zmiennych dotyczą te same reguły, co innych 12
4 Podstawowy kurs języka PHP rodzajów nazw w PHP. Poprawna nazwa zmiennej zaczyna się od litery lub znaku podkreślenia: "_", po których może wystąpić dowolna ilość liter, cyfr lub znaków podkreślenia. PHP, podobnie jak jeżyk JavaScript, nie wymaga (a nawet nie obsługuje) jawnej deklaracji typów zmiennych. Typ zmiennej jest określany na podstawie kontekstu, w jakim ta zmienna jest używana. Oznacza to m.in., że po przypisaniu łańcucha znaków do zmiennej $var, zmienna ta zmienia swój typ na string. Jeśli potem zostanie jej przypisana wartość całkowita, $var zmienia swój typ na integer. Innymi słowy PHP charakteryzuje się słabą kontrola typów (weakly typed). 4.6 Rzutowanie typów Rzutowanie typów w PHP działa mniej więcej tak jak w języku C: nazwa docelowego typu umieszczana jest w nawiasach przed nazwą zmiennej, która ma być zrzutowana. $foo = 10; // $foo jest liczbą całkowitą $bar = (float) $foo; // $bar jest typu float (zmiennoprzecinkowego) W PHP mamy następujące operatory rzutowania: (int), (integer) - rzutowanie do liczb całkowitych, (bool), (boolean) - rzutowanie do typu boolowskiego, (float), (double), (real) - rzutowanie do liczb zmiennoprzecinkowych, (string) - rzutowanie do łańcucha znaków, (array) - rzutowanie do tablicy, (object) - rzutowanie do obiektu, Uwaga! Zamiast rzutować zmienną do łańcucha znaków operatorem, można też umieścić zmienną w cudzysłowie podwójnym. 4.7 Przypisanie wartości do zmiennych W PHP 3, przypisanie wartości zmiennych było możliwe tylko przez nadanie im wartości. Innymi słowy, jeśli przypiszemy do zmiennej jakieś wyrażenie, wartość tego wyrażenia zostanie skopiowana do zmiennej. Oznacza to, że po przypisaniu wartości jednej zmiennej do drugiej, późniejsza zmiana wartości jednej z nich nie spowoduje zmiany wartości drugiej. PHP 4 oferuje jeszcze jeden sposób przypisywania wartości do zmiennych: przypisanie przez referencję. Oznacza to, że nowa zmienna tylko odnosi się (innymi słowy, "staje się 13
4 Podstawowy kurs języka PHP aliasem" lub "wskazuje na") do pierwotnej zmiennej. Zmiany wykonane na nowej zmiennej oddziałują także na pierwotną zmienną i vice versa. Ma to też takie znaczenie, że nie następuje żadna operacja skopiowania, czyli przypisanie następuje szybciej. Aby przypisać przez referencję, stawiamy znak ampersand (&) przed nazwą zmiennej przypisywanej (zmiennej, od której pobieramy wartość). $foo = "PHP"; $bar = &$foo; // Przypisz wartość "PHP" do $foo. // Przypisz referencyjnie $foo do $bar. Uwaga! Należy pamiętać, że tylko wyrażenia posiadające nazwę mogą być przypisane przez referencję. 4.8 Zasięg zmiennych Zasięg zmiennej jest zależny od miejsca, w jakim została zdefiniowana. W języku PHP wyróżnia się trzy podstawowe rodzaje zasięgu: Deklarowane w skrypcie zmienne globalne widziane są w całym skrypcie, lecz nie wewnątrz funkcji. Zmienne używane wewnątrz funkcji widziane są jedynie przez tę funkcję (zmienne lokalne). Zmienne używane wewnątrz funkcji, lecz deklarowane jako globalne, odnoszą się do zmiennych globalnych o tych samych nazwach. $a = 1; /* zasięg globalny */ function Test() { echo $a; /* odwołanie do zmiennej o zasięgu lokalnym */ } Test(); Ten skrypt nie wyświetli niczego, ponieważ instrukcja echo odwołuje się do zmiennej lokalnej $a, której jak dotąd nie została przypisana żadna wartość. $a = 1; $b = 2; function Sum(){ global $a, $b; 14
4 Podstawowy kurs języka PHP $b = $a + $b; } Sum(); echo $b; Powyższy skrypt wyświetli wynik "3". Przez zadeklarowanie wewnątrz funkcji globalności zmiennych $a i $b, wszystkie odwołania do tych zmiennych będą odnosiły się do ich globalnych wersji. Drugim sposobem uzyskania dostępu do zmiennych globalnych wewnątrz funkcji jest użycie specjalnej, zdefiniowanej przez PHP tablicy $GLOBALS. Powyższy przykład można zatem przepisać tak: $a = 1; $b = 2; function Sum() { $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"]; } Sum(); echo $b; $GLOBALS jest tablicą asocjacyjną, gdzie nazwa zmiennej jest kluczem, a zawartość zmiennej wartością komórki tablicy. Jeszcze jedną ważną rzeczą, związaną z zasięgiem zmiennych jest zmienna statyczna (static variable). Zmienna statyczna może mieć wyłącznie zasięg lokalny, ale nie traci swojej wartości, kiedy program opuści ten zasięg lokalny, w którym dana zmienna statyczna się znajduje. function Test(){ static $a = 0; echo $a; $a++; } Za każdym wywołaniem funkcji test, zostanie wyświetlona wartość zmiennej $a, po czym ta zmienna zostanie inkrementowana. Funkcja jest bezużyteczna, gdy $a nie jest zmienna statyczną, gdyż przy każdym jej wywołaniu zmienna $a otrzymuje wartość 0, w związku z czym funkcja stale wyświetla "0". Występująca potem inkrementacja $a++ nie ma żadnego znaczenia, gdyż funkcja się kończy i zmienna $a znika. 15
4 Podstawowy kurs języka PHP 4.9 Zmienne zmienne W niektórych przypadkach jest wygodne, by móc użyć zmiennej o zmiennej nazwie. To znaczy zmiennej, której nazwa może być zmieniana dynamicznie. Zwykła zmienna jest ustawiana wyrażeniem jak poniżej: $a = "witaj"; Zmienna zmienna pobiera wartość jednej zmiennej i traktuje ją jako nazwę zmiennej. W powyższym przykładzie, witaj może stać się nazwą zmiennej, przy użyciu dwóch znaków dolara, tzn. $$a = "świecie"; W tym momencie dwie zmienne zostały zdefiniowane i umieszczone w drzewie symbolicznym PHP: $a zawierająca witaj i $witaj zawierająca świecie. Zatem poniższy zapis: echo "$a ${$a}"; znaczy to samo, co: echo "$a $witaj"; tzn. obydwa wyświetlą: witaj świecie. Uwaga! Aby używać zmiennych zmiennych jako tablic, trzeba rozwiązać pewną niejasność. Mianowicie, jeśli napiszemy $$a[1], parser musi wiedzieć, czy chcemy użyć $a[1] jako nazwy zmiennej, czy $$a jako nazwy tablicy, której rekord [1] nas interesuje. W tym przypadku należy zastosować odrębną składnię: ${$a[1]} dla pierwszego przypadku a ${$a}[1] dla drugiego. 4.10 Testowanie i ustawianie typów zmiennych Dwie najważniejsze funkcje testujące typy zmiennych, to gettype() oraz settype(). Składnia tych funkcji jest następująca: string gettype(mixed var) int settype(string var, string type) Jako argument funkcji gettype() przekazujemy zmienną. Funkcja ta określa typ owej zmiennej, po czym zawraca łańcuch znaków, reprezentujący nazwę tego typu, lub łańcuch unknown type (nieznany typ), w przypadku gdy zastosowano zmienną typu niestandardowego, tj. innego niż integer, double, string, array lub object. 16
4 Podstawowy kurs języka PHP Funkcja settype() pozwala na zmianę typu. Przekazujemy zmienną, której chcemy nadać inny typ oraz łańcuch znaków reprezentujący nowy typ. Łańcuch ten musi zawierać jedną z przedstawionych powyżej wartości, opisujących standardowe typy PHP. Oto przykład użycia tych funkcji: $a = 56; echo gettype($a)."<br>"; settype($a, "double"); echo gettype($a)."<br>"; Przy pierwszym wywołaniu funkcji gettype(), zmienna $a jest typu integer. Po wywołaniu funkcji settype(), typ tej zmiennej zostaje zmieniony na double. PHP oferuje również szereg funkcji pozwalających na testowanie, czy dana zmienna jest określonego typu. Każda z tych funkcji wymaga jako argumentu sprawdzanej zmiennej, a zwraca wartość true lub false. Oto lista tych funkcji: is_array(), is_double(), is_float(), is_real() (te funkcje mogą być stosowane zamiennie), is_long(), is_int(), is_integer() (te funkcje mogą być stosowane zamiennie), is_string(), is_object(). W języku PHP dostępnych jest kilka funkcji, umożliwiających testowanie stanu zmiennej. Pierwszą z nich jest isset(); jej składnia jest następująca: int isset(mixed var) Funkcja ta pobiera jako argument nazwę zmiennej, a zwaraca wrtość true w przypadku gdy zmienna ta istnieje, lub wartość false w przeciwnym razie. Korzystając z funkcji unset() można usunąć określoną zmienną z pamięci. Funkcja ta ma następującą składnię: int unset(mixed var) Funkcja ta "pozbywa się" zmiennej przekazanej jako argument, po czym zawraca wartość true. Kolejna funkcja testująca stan zmiennej to empty(). Sprawdza ona czy przekazana jej w argumencie zmienna istnieje i czy nie ma ona wartości pustej (null) lub zerowej. W zależności od wyniku tego testu jest zwracana wartość true lub false. A oto składnia tej funkcji: 17
4 Podstawowy kurs języka PHP int empty(mixed var) Jeśli chodzi o skrypty obsługujące formularze, to funkcja isset() zawsze powinna zwrócić wartość true - niezależnie od tego, jaką wartość wpisaliśmy do odpowiadającego tej zmiennej pola formularza (a nawet wówczas, gdy pozostawimy to pole puste). Wartość zwrócona przez funkcję empty() będzie natomiast zależała od tego, czy do pola formularza coś wpisaliśmy (wartość false), czy też pozostało ono puste (wartość true). Funkcje te są bardzo przydatne podczas sprawdzania, czy użytkownik wypełnił odpowiednie pola. Efekt jaki uzyskujemy w wyniku rzutowania zmiennych, możemy osiągnąć również poprzez wywołanie funkcji. W języku PHP dostępne są trzy funkcje, przeznaczone do tego celu: int intval(mixed var) double doubleval(mixed val) string strval(mixed val) Każda z tych funkcji wymaga podania jako argumentu zmiennej, którą następnie zwraca, przekonwertowaną do odpowiedniego typu. 4.11 Stałe Stała jest identyfikatorem (nazwą) dla prostej wartości. Jak sama nazwa wskazuje, wartość ta nie może się zmieniać podczas działania skryptu. Domyślnie, przy stałych uwzględniana jest wielkość liter. Przyjęto, że stałe są pisane dużymi literami. Nazwa stałej podlega takim samym zasadom jak każda inna w PHP. Prawidłowa nazwa stałej rozpoczyna się literą, znakiem podkreślenia (_), następnie mogą występować litery, cyfry lub znaki podkreślenia. Możemy definiować stałe używając funkcji define(): define("stala", "Hello world!"); define("cena",100); Różnice pomiędzy stałymi, a zmiennymi: Stałe nie mają znaku dolara $ przed nazwą; Stałe mogą być definiowane oraz używane wszędzie bez zważania na zasady dotyczące zakresu ich dostępności; Stałe nie mogą być redefiniowane i kasowane po tym jak raz zostały zdefiniowane; Stałe mogą zawierać tylko wartości skalarne (boolean, integer, double i string). 18