Rozdzia│ 7. Zmienne
Podstawy
Zmienne w PHP s▒ reprezentowane przez znak dolara poprzedzaj▒cy nazwΩ zmiennej. W nazwach zmiennych rozr≤┐niana jest wielko╢µ liter.
$var = "Bob";
$Var = "Joe";
echo "$var, $Var"; // wyrzuci "Bob, Joe"
W PHP zmienne maj▒ zawsze jak▒╢ warto╢µ. Kiedy przypiszesz wyra┐enie do zmiennej, warto╢µ wyra┐enia jest kopiowana do docelowej zmiennej. WiΩcej informacji znajdziesz w sekcji Wyra┐enia.
PHP4 oferuje tak┐e inny sposob wyznaczania warto╢ci dla zmiennych: przez referencjΩ. To oznacza, ┐e nowa zmienna odnosi siΩ (inaczej m≤wi▒c, "staje siΩ aliasem dla" lub "wskazuje na") do oryginalnej zmiennej. Zmiana nowej zmiennej odnosi siΩ r≤wnie┐ do orygina│u, i odwrotnie. Ten spos≤b wyznaczania warto╢ci charakteryzuje siΩ du┐▒ szybko╢ci▒, co ma zastosowanie w d│ugich pΩtlach lub przy wyznaczaniu du┐ych tablic czy obiekt≤w.
Referencje okre╢la siΩ poprzez ampersand (&) przed nazw▒ zmiennej ╝r≤d│owej. Poni┐szy kawa│ek kodu zwraca dwa razy 'Nazywam siΩ Zenek' :
<?php
$foo = 'Zenek'; // przypisanie warto╢ci 'Bob' do zmiennej $foo
$bar = &$foo; // referencja do $foo przez $bar.
$bar = "Nazywam siΩ $bar"; // Zmiana $bar...
echo $foo; // $foo tak┐e siΩ zmieni│o.
echo $bar;
?>
Uwaga: tylko nazwane zmienne mog▒ byµ u┐ywane przez referencje.
<?php
$foo = 25;
$bar = &$foo; // prawid│owe wyznaczenie referencji.
$bar = &(24 * 7); // nieprawid│owe; brak nazwanej zmiennej
function test() {
return 25;
}
$bar = &test(); // nieprawid│owe
?>
Predefiniowane zmienne
PHP dostarcza wiele predefiniowanych zmiennych, kt≤re mog▒ byµ u┐yte przez skrypt. DostΩpno╢µ niekt≤rych zmiennych zale┐y od konfiguracji, typu, wersji serwera itp.
Oto lista zmiennych dostΩpnych w typowej instalacji php, pracuj▒cego jako modu│ serwera Apache 1.3.6. Pe│n▒ listΩ zmiennych predefiniowanych (i du┐o innych przydatnych informacji ) uzyskasz wywo│uj▒c funkcjΩ phpinfo().
Zmienne Apache'a (wybrane)
Te zmienne s▒ utworzone przez serwer Apache. Je┐eli uruchomisz inny serwer WWW, zmienne mog▒ siΩ r≤┐niµ. Wiele z ponizszych zmiennych jest opisanych r≤wnie┐ w specyfikacji CGI 1.1 .
Uwaga: kilka zmiennych mo┐e byµ nie dostΩpnych je╢li uruchomisz PHP z linii komend.
AUTH_TYPE
Metoda autoryzacji jakiej u┐ywa serwer w celu stwierdzenia praw dostΩpu u┐ytkownika do chronionych zasob≤w
GATEWAY_INTERFACE
Wersja specyfikacji CGI, kt≤rej u┐ywa serwer np. 'CGI/1.1'.
SERVER_NAME
Nazwa hosta (lub IP) na kt≤rym jest wykonywany skrypt. Je┐eli skrypt jest wykonywany na wirtualnym ho╢cie, warto╢µ bΩdzie okre╢lona przez niego.
SERVER_SOFTWARE
úa±cuch identyfikuj▒cy serwer www, zwracany przez serwer w nag│≤wku odpowiedzi. SERVER_PROTOCOL
Nazwa i wersja protoko│u obs│uguj▒cego zapytanie np. 'HTTP/1.0';
SERVER_ADMIN
Adres kontaktowy do administratora serwera.
SERVER_PORT
Port na serwerze www u┐yty do komunikacji. Domy╢lnie jest to '80'
SERVER_SIGNATURE
Sygnatura serwera tzn. wersja, nazwa hosta itp.
QUERY_STRING
Dane przes│ane do serwera (argumenty) znajduj▒ce siΩ po znaku zapytania (?) w adresie URL przy u┐yciu metody GET
DOCUMENT_ROOT
Katalog g│≤wny dla stron www, skrypt≤w.
HTTP_ACCEPT
Zawarto╢µ pola Accept: z nag│≤wka HTTP dla aktualnego ┐▒dania.
HTTP_ACCEPT_CHARSET
Zawarto╢µ pola Accept-Charset: z nag│≤wka HTTP dla aktualnego zapytania,
Przyk│ad: 'iso-8859-1,*,utf-8'.
HTTP-REFERER
Adres strony, z kt≤rej u┐ytkownik wszed│ na stronΩ ze skryptem.
HTTP_ENCODING
Zawarto╢µ pola Accept-Encoding: z nag│≤wka HTTP dla aktualnego zapytania,
Przyk│ad: 'gzip'.
HTTP_ACCEPT_LANGUAGE
Zawarto╢µ pola Accept-Language: z nag│≤wka HTTP dla aktualnego zapytania,
Przyk│ad: 'en'.
HTTP_CONNECTION
Zawarto╢µ pola Connection: z nag│≤wka HTTP dla aktualnego zapytania,
Przyk│ad: 'Keep-Alive'.
HTTP_HOST
Zawarto╢µ pola Host: z nag│≤wka HTTP dla aktualnego zapytania,
HTTP_USER_AGENT
Zawarto╢µ pola User_Agent:. z nag│≤wka HTTP dla aktualnego zapytania. Jest to sygnatura u┐ywana przez przegl▒darkΩ klienta, np. Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586). Aby rozpoznaµ typ przegl▒darki klienta mo┐esz u┐yµ r≤wnie┐ funkcji get_browser().
SCRIPT_FILENAME
Ca│kowita ╢cie┐ka dostΩpu, aktualnie wykonywanego skryptu.
SCRIPT_NAME
Zawiera wirtualn▒ ╢cie┐kΩ dostΩpu do skryptu.
PATH_INFO
Fragment URLa danego skryptu wystΩpuj▒cy po nazwie serwera
PATH_TRANSLATED
Pe│na fizyczna ╢cie┐ka dostΩpu do skryptu.
REQUEST_URI
URI dla tej strony; dla przyk│adu, '/index.html'.
REQUEST_METHOD
Metoda zaputania jaka by│a u┐yta przy dostΩpie do skryptu PHP np. 'GET', 'HEAD', 'POST', 'PUT'.
REMOTE_USER
Nazwa u┐ytkownika, je╢li serwer www obs│uguje RFC 931 a skrypt jest zabezpieczony.
REMOTE_ADDR
Adres IP zdalnego u┐ytkownika przegl▒daj▒cego stronΩ.
REMOTE_PORT
Port na maszynie zdalnego u┐ytkownika u┐ywany do komunikacji z serwerem www.
REMOTE_HOST
Nazwa hosta, z kt≤rego klienta otworzy│ po│▒czenie.
Zmienne ╢rodowiskowe
Te zmienne s▒ importowane ze ╢rodowiska w kt≤rym parser PHP jest uruchomiony.
Zmienne PHP
Te zmienne s▒ tworzone przez PHP.
argv
Tablica argument≤w przes│anych do skryptu. Kiedy skrypt jest wywo│ywany metod▒ GET, argumentem bΩdzie query string. Kiedy skrypt jest wywo│ywany z linii komend, dostΩp do argument≤w realizowany jak w C.
argc
Zawiera liczbΩ parametr≤w przes│anych do skryptu z linii komend
PHP_SELF
Nazwa pliku aktualnie wykonywanego skryptu, wzglΩdem document root. Je┐eli PHP jest uruchomione jako interpreter linii komend, ta zmienna nie jest dostΩpna.
HTTP_GET_VARS, HTTP_POST_VARS, HTTP_COOKIE_VARS
tworzone s▒ trzy skojarzone ze sob▒ tablice: $HTTP_GET_VARS, $HTTP_POST_VARS i $HTTP_COOKIE_VARS kt≤re przechowuj▒ zmienne przes│ane metodami GET,POST,COOKIE.
Mo┐esz zmieniµ tΩ opcje poprzez dyrektywΩ track_vars w pliku konfiguracyjnym PHP lub w samym skrypcie poprzez <?php_track_vars?> na pocz▒tku skryptu.
ZasiΩg zmiennych
ZasiΩg zmiennej zalezy od kontekstu jej u┐ycia. Przewa┐nie wszystkie zmienne PHP s▒ dostΩpne globalnie w skrypcie, co r≤wnie┐ obejmuje wszystkie pliki do│▒czane ( include() ) do skryptu jaki i wymagane ( require() ) przez skrypt.
Przyk│ad:
$a = 1;
include "b.inc";
Tutaj zmienna $a bΩdzie dostΩpna wewn▒trz do│▒czonego skryptu b.inc. Wewn▒trz funkcji zdefiniowanych przez u┐ytkownika definiowane s▒ zmienne lokalne. Jakakolwiek zmienna u┐yta wewn▒trz takiej funkcji ma ograniczony zasiΩg tylko do tej funkcji.
Przyk│ad:
$a = 1; /* zasiΩg globalny */
Function Test () {
echo $a; /* odwo│anie do zmiennej lokalnej */
}
Test ();
Powy┐szy skrypt nie wy╢wietli ┐adnej warto╢ci poniewa┐ zmienna lokalna $a nie zosta│a zadeklarowana. Mo┐esz tu zauwa┐yµ pewn▒ r≤┐nicΩ wzglΩdem jΩzyka C, gdzie zmienne globalne s▒ dostΩpne w funkcjach i ewentualnie s▒ nadpisywane przez zmienne lokalne. W PHP zmienne globalne musz▒ byµ zadeklarowane komend▒ global wewn▒trz funkcji, w kt≤rej maj▒ byµ u┐yte.
Przyk│ad:
$a = 1;
$b = 2;
Function Suma () {
global $a, $b;
$b = $a + $b;
}
Suma ();
echo $b;
Powy┐szy skrypt zwr≤ci "3". Poprzez zadeklarowanie globalnych $a i $b we wnΩtrzu funkcji, skrypt pracuje na zmiennych globalnych a nie na lokalnych. Nie ma ogranicze± co do liczby u┐ywanych zmiennych globalnych przez funkcjΩ.
Drugim sposobem dostΩpu do zmiennych globalnych w funkcjach jest predefiniowana tablica $GLOBALS.
Poprzedni przyk│ad mo┐na zapisaµ jako:
$a = 1;
$b = 2;
Function Sum () {
$GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];
}
Sum ();
echo $b;
Tablica $GLOBALS jest tablic▒ skojarzon▒ z nazwami zmiennych globalnych bΩd▒cymi kluczem tablicy, za╢ zawarto╢µ zmiennej jest warto╢ci▒ elementu tablicy.
Inn▒ wa┐n▒ cech▒ zmiennych jest mo┐liwo╢µ u┐ycia zmiennych statycznych (static). Zmienna statyczna jest zmienn▒ lokaln▒ i istnieje tylko w funkcjach, ale jej warto╢µ nie jest tracona kiedy program wychodzi z funkcji gdzie by│a okre╢lona.
Przyk│ad:
Function Test () {
$a = 0;
echo $a;
$a++;
}
Ta funkcja jest zupe│nie bezu┐yteczna; przez ca│y ustawia zmienn▒ $a na warto╢µ 0 i j▒ wy╢wietla. NastΩpnie zwiΩksza warto╢µ zmiennej przez $a++ i wychodzi z funkcji przez co warto╢µ $a jest tracona. U┐yteczna funkcja licz▒ca, kt≤ra nie bΩdzie traci│a aktualnej warto╢ci zmiennej powinna u┐ywaµ zmiennej $a jako zmiennej statycznej:
Function Test () {
static $a = 0;
echo $a;
$a++;
}
Teraz przy ka┐dym wywo│aniu funkcji Test() bΩdzie wypisywana warto╢µ zmiennej $a oraz zwiΩkszana jej warto╢µ.
Statyczne zmienne mog▒ byµ wykorzystane w funkcjach rekursywnych. Funkcja rekursywna to taka kt≤ra wywo│uje sama siebie. Musisz jednak zapewniµ w│▒╢ciwy spos≤b na zako±czenie takie funkcji (bo mo┐e pracowaµ w niesko±czono╢µ).
Poni┐sza funkcja zlicza rekursywnie do 10, a poprzez u┐ycie zmiennej statycznej $count wie kiedy ma zatrzymaµ zliczanie:
Function Test () {
static $count = 0;
$count++;
echo $count;
if ($count < 10) {
Test ();
}
$count--;
}
Zmienna zmiennej
Czasami jest wygodnie mieµ zmienn▒ nazwΩ zmiennej; tzn. nazwa zmiennej jest ustawiana dynamicznie.
Normalna zmienna jest deklarowana nastΩpuj▒co:
$a = "hello";
Zmienna zmiennej na podstawie warto╢ci pierwszej zmiennej okre╢la nazwΩ drugiej zmiennej. W poni┐szym przyk│adzie, zawarto╢µ pierwszej zmiennej $a (hello) jest u┐yta jako nazwa drugiej zmiennej, np:.
$$a = "world";
W tym momencie dwie zmienne zosta│y zdefiniowane i zapamiΩtane w $$a jako: $a z zawarto╢ci▒ "hello" i $hello z zawarto╢ci▒ "world". Dlatego wyra┐enie :
echo "$a ${$a}";
wy╢wietli dok│adnie to samo co:
echo "$a $hello";
Obydwa wyra┐enia zwracaj▒: hello world.
W przypadku tablic nale┐y uwa┐aµ w okre╢laniu co ma byµ nazw▒ zmiennej.
Aby u┐yµ zmiennej, kt≤rej nazwa bazuje na zawarto╢ci elementu tablicy $a[1], zastosuj sk│adniΩ ${$a[1]}.
Aby u┐yµ warto╢ci elementu tablicy, kt≤rej nazwa bazuje na zawarto╢ci innej zmiennej, zastosuj sk│adniΩ ${$a}[1].
Zmienne spoza PHP
Formularze HTML (metody: GET i POST)
Po przes│aniu formularza do skryptu PHP, wszelkie zmienne z formularza bΩd▒ automatycznie dostΩpne w skrypcie pod takimi samymi nazwami.
Dla przyk│adu:
Przyk│ad 7-1. Zmienne formularza
<form action="foo.php" method="post">
Name: <input type="text" name="name"><br>
<input type="submit">
</form>
|
Po przes│aniu, PHP stworzy zmienn▒ $name, kt≤ra bΩdzie pamiΩta│a zawarto╢µ pola name w formularzu.
PHP poradzi sobie r≤wnie┐ z tablicami w kontek╢cie zmiennych formularza, ale tylko z tablicami jednowymiarowymi. DziΩki temu, mo┐esz grupowaµ odpowiednie zmienne lub pobieraµ dane z rozbudowanych formularzy:
Przyk│ad 7-2. Bardziej z│o┐ony formularz
<form action="array.php" method="post">
Nazwisko: <input type="text" name="personal[name]"><br>
Email: <input type="text" name="personal[email]"><br>
Piwo: <br>
<select multiple name="beer[]">
<option value="Zywiec">Zywiec
<option value="Lech">Lech
<option value="Warka">Warka
</select>
<input type="submit">
</form>
|
Je┐eli w│▒czy│e╢ opcjΩ track_vars w pliku konfiguracyjnym PHP lub u┐y│e╢ dyrektywy <?php_track_vars?> w skrypcie, zmienne wys│ane metod▒ POST lub GET zostan▒ r≤wnie┐ umieszczone w tablicach $HTTP_POST_VARS i $HTTP_GET_VARS .
IMAGE SUBMIT i dodatkowe zmienne
Podczas wysy│ania formularza mo┐liwe jest zastosowanie obrazka zamiast przycisku submit:
<input type=image src="image.gif" name="sub">
Kiedy u┐ytkownik kliknie na obrazku, formularz zostanie przes│any do serwera wraz z dwoma dodatkowymi zmiennymi, sub_x i sub_y. Zmienne te zawieraj▒ dok│adn▒ lokalizacjΩ punktu w kt≤ry klikn▒│ u┐ytkownik na obrazku. Nazwy tych zmiennych przesy│ane przez przeg│▒darki czΩsto zawieraj▒ kropkΩ zamiast podkre╢lenia, ale PHP dokonuje automatycznej konwersji tych znak≤w.
HTTP Cookies
PHP wspiera HTTP cookies. Cookies s▒ mechanizmem dla przechowywania danych na komputerach zdalnych u┐ytkownik≤w. Zwykle u┐ywane do ╢ledzenia odwiedzin strony lub zwrotnej identyfikacji u┐ytkownika. Mo┐esz zdefiniowaµ cookies u┐ywaj▒c funkcji SetCookie(). Cookies s▒ czΩ╢ci▒ nag│≤wka HTTP, wiΩc funkcja SetCookie musi byµ wywo│ana zanim jakakolwiek zawarto╢µ zostanie wysy│ana do przegl▒darki. Jest to identyczne ograniczenie jak w przypadku funkcji Header(). Cookies wys│ane do serwera przez klienta bΩdzie automatycznie umieszczane w zmiennej, podobnie jak ma to miejsce przy odbieraniu danych przes│anych metodami GET czy POST.
Je┐eli chcia│by╢ wyznaczaµ kilka warto╢ci dla pojedy±czej cookie, dodaj dwa nawiasy [] do nazwy cookie.
Przyk│ad:
SetCookie ("MojeCookie[]", "Testowane", time()+3600); //dopisuje na koniec tablicy
Pamietaj, ┐e nowa cookie zast▒pi poprzedni▒ cookie o takiej samej nazwie w przegl▒darce klienta.
Zmienne ╢rodowiskowe
PHP automatycznie udostΩpnia zmienne ╢rodowiskowe jako normalne zmienne PHP.
echo $HOME; /* wyswietla zawarto╢µ zmiennej ╢rodowiskowej HOME
. */
Funkcja getenv() odczytuje zmienn▒ ╢rodowiskow▒, za╢ putenv() ustawia tak▒ zmienn▒.
Kropki w nazwach zmiennych
Zwykle PHP nie zmienia nazwy zmiennej przesy│anej do skryptu. Jednak kropka w nazwie zmiennej nie jest akceptowana.
$varname.ext; /* z│a nazwa zmiennej */
W tym przypadku analizator sk│adni rozpoznaje zmienn▒ $varname, po niej operator │▒czenia │a±cuch≤w (kropka), a nastΩpnie nieznany ci▒g. Rezultat nie bΩdzie na pewno zadowalaj▒cy.
W celu unikniΩcia takich problem≤w, PHP automatycznie zastΩpuje wszelkie kropki w nazwach zmiennych na podkre╢lenia.
Okre╢lanie typu zmiennej
Poniewa┐ PHP okre╢la typy zmiennych i konwertuje je gdy zachodzi taka potrzeba, nie zawsze wiadomo jaki aktualnie typ posiada dana zmienna. PHP zawiera kilka funkcji kt≤re zwaracaj▒ informacje o typie zmiennej. To s▒ gettype(), is_long(), is_double(), is_string(), is_array() i is_object().
|