PHP
Wprowadzenie
Jarek Durak
Języki skryptowe
❚ Są gotowe do działania zaraz po napisaniu - nie trzeba ich kompilować (lub kompilowane są
w trakcie pierwszego uruchomienia)
❚ Są najczęściej interpretowane (nie kompilowane) w trakcie uruchamiania
❚ Zwykle nie ma potrzeby deklarowania typu
zmiennych, typ zmiennych ustalany jest
w momencie przypisania wartości.
Języki skryptowe
❚ Nazwa zmiennej jest poprzedzona zazwyczaj
znakiem specjalnym, zwykle „$” (z wyjątkami np.
JavaScript, Vbasic ...)
❚ Zalety języków skryptowych
❙ Szybsze tworzenie skryptów
❙ Łatwiejsza modyfikacja
❙ brak konieczności deklarowania zmiennych (mogą pojawić się w dowolnym momencie)
❙ dostęp do baz danych
Języki skryptowe
❚ Wady
❙ Wolniejsze działanie (konieczność każdorazowej interpretacji skryptu, lub przynajmniej przy pierwszym uruchomieniu)
❙ Konieczność ładowania interpretera (osobnego programu lub np. modułu serwera WWW)
❙ Trudna kontrola nad zmiennym
❚ Przykłady języków skryptowych
❙ (V)Basic, bash, perl, tcl, python, php3/4/5/6, awk, ruby, haserl i inne
❚ Ze względu na szybkość pisania i modyfikacji skryptów zyskały dużą popularność w tworzeniu dynamicznie generowanych stron WWW
Języki skryptowe
❚ Większość języków skryptowych jest językami ogólnego przeznaczenia mogą być stosowane do:
❙ Tworzenia skryptów uruchamianych z lini poleceń
❙ automatyzacji zadań administratorskich
❙ tworzenia programów GUI
❙ tworzenia dynamicznie generowanych stron WWW
❚ Sposoby uruchamiania programów skryptowych na potrzeby generowania stron WWW
❙ CGI (Common Gateway Interface)
❙ jako moduł serwera
CGI
❚ Poprzez interfejs CGI możliwe jest uruchomienie:
❙ skryptu napisanego w praktycznie dowolnym języku skryptowym, którego interpreter jest zainstalowany w systemie
❙ programów kompilowanych (java, C/C++, pascal,...)
❚ wymiana danych następuje poprzez zamianę
standardowego wyjścia/wejścia
❙ dane zamiast z klawiatury pobierane są z serwera WWW
❙ wyprowadzane zamiast na ekran z powrotem do serwera WWW
❙ serwer przekazuje je jako stronę do przeglądarki
CGI
❚ Praktycznie wszystkie serwery WWW obsługują skrypty CGI (Apache, IIS, iPlanet, Zeus, Roxen, OmniHTTPd, lighttpd...)
❚ Dla każdego uruchomienia skryptu ładowany jest skrypt i interpreter (duże obciążenie serwera)
❚ Możliwość uruchamiania skryptów przypisana jest do katalogu lub/i rozszerzenia
❙ np. katalog /cgi-bin, .cgi (ogólnie program cgi) .pl - perl,
.php(3,4,5,6), .asp - VBasic, py -python ...
Moduł serwera WWW
❚ W odróżnieniu od CGI interpreter języka jest ładowany tylko raz jako element serwera WWW
❚ Raz uruchomiony skrypt (zwykle) jest
przechowywany w pamięci aż do wyłączenia
serwera WWW
❚ Często wykonuje wstępną kompilację co zmniejsza zajętość pamięci i przyspiesza wykonywanie
programu
Dlaczego PHP?
❚ Został opracowany specjalnie dla WWW
❙ Obsługa nagłówków protokołu HTTP
❘ sesje, autoryzacja, typ dokumentu, strony kodowe
❘ umożliwia łączenie kodu HTML i PHP
<html>
<head>
<title>Przykład</title>
</head>
<body>
<?php echo ”To jest skrypt PHP!";
?>
</body>
</html>
Dlaczego PHP?
❚ Obsługuje prawie wszystkie systemy operacyjne
❚ Obsługuje większość serwerów WWW jako moduł
bądź w trybie CGI
❚ jako moduł serwera posiada opcję prekompilacji i cachowania
❚ posiada składnię podobną do języka „C” ale jest prostszy i łatwiejszy do nauki
❚
❚ Jest dostępny na wielu serwerach gdzie można bezpłatnie umieszczać strony. Na komercyjnych zwykle z bazą MySQL
Dlaczego PHP?
❚ posiada wbudowaną możliwość obsługi wielu
baz danych:
❙ Adabas, Ingres, Oracle, dBase, InterBase,
Ovrimos, Empress, FrontBase, PostgreSQL,
FilePro (read-only), mSQL, Solid, Hyperwave, Direct MS-SQL, Sybase, IBM DB2, MySQL,
Velocis, Informix, ODBC, Unix dbm
❚ Jest darmowy (w wersji podstawowej), można kupić wersję komercyjną z rozbudowanymi
możliwościami i środowiskiem
programistycznym
Dlaczego PHP?
❚ Posada wbudowaną możliwość wykorzystywania bibliotek graficznych gd, ImageMagic
❚ Obsługa PDF, XML, SMTP, Flash, Java ...
❚ Obsługę bibliotek kryptograficznych
❚ Obsługę aplikacji wspomagających e-bussines np.
CyberCache
❚ Bogate wsparcie podręczniki, biblioteki procedur i klas
Separacja kodu PHP od
HTML
❚ 1. <? echo (”prosty zgodny z SGML\n"); ?>
❚ 2. <?php echo ”dla XHTML lub XML\n"; ?>
❚ 3. <script language="php">
❚ echo (”inny sposób");
❚ </script>
❚ 4. <% echo ”tagi w stylu ASP"; %>
❚ <%= $zmienna; # skrót dla "<%echo .." %>
Separacja instrukcji
❚ Instrukcje oddzielane są od siebie średnikiem
„;”
❚ Przed „?>”, „%>”, „}” po instrukcji można opuścić „;”
❚ Poniższe przykłady są równoważne
<?php
echo (”to jest test");
?>
<?php echo ”to jest test" ?>
Komentarze
❚ Można stosować trzy style komentarzy
❙ jednoliniowe w stylu „C++” - „//”
❙ jednoliniowe w stylu Shella Unix „#”
❙ wieloliniowe początek „/*”, „*/” - koniec
<?php
echo "test"; // jednoliniowy - c++
/* wieloliniowy
komentarz */
echo ”Bez komentarza";
echo ”Ostatni test"; # jednoliniowy - Shell
Typy zmiennych
❙ zmiennoprzecinkowe
❙ całkowite
❙ ciągi znaków
❙ tablice
❙ obiekty
❚ Nazwa zmiennych poprzedzona jest znakiem „$”
❚ nazwa zmiennej nie może zaczynać się od cyfry i musi się składać z podstawowego zestawu ASCII [a-z][A-Z]
[0-9],_ i znaków >127
Typ całkowity
❚ Wielkość dopuszczalnej liczby całkowitej
zależna jest od platformy
$a = 1234; # liczba całkowita dodatnia
$a = -123; # liczba całkowita ujemna
$a = 0123; # ósemkowa (83 dziesiętnie)
$a = 0x12; # szesnastkowa (18 dziesiętnie)
Liczby zmiennoprzecinkowe
❚ Wielkość dopuszczalnej liczby
zmiennoprzecinkowej zależna jest od
platformy
$a = 1.234; # liczba zmiennoprzecinkowa
$a = 1.2e3; # liczba zmiennoprzecinkowa
# w formacie potęgi dziesiętnej
# 1,2 * 103
Łańcuchy znaków
❚ Znaki specjalne
❙ \n - znak nowej lini
❙ \r - powrót karetki
❙ \t - tabulacja
❙ \\ - \
❙ \$ - $
❙ \” - ”
Łańcuchy znaków
❚ Łańcuchy znaków mogą być ograniczone przez:
❙ apostrof - $a=’łańcuch znaków’;
❙ cudzysłów - $a=”łańcuch znaków”;
❙ etykiety i operatora „<<<„
$a=<<< EOD Ła cuch
ń
znaków
wieloliniowy
EOD;
Łańcuchy znaków
<?php
$a=12;
echo ”to jest $a ”;
echo ’to jest $a ’;
$b=<<<EOT to jest $a
EOT;
echo $b
?>
Zmienne tablicowe
❚ PHP obsługuje 2 rodzaje zmiennych
tablicowych:
❚ tradycyjne wektory
❙ $a[0]=1;
//element 0 tablicy = 1
❙ $a[1]=”test”;
// element 1 tablicy ma wartość
”test”;
❙ $a[]=3;
//kolejny el. tablicy(nowy) = 3
❙ $a[1][1]=3;
// tablica dwuwymiarowa
❚ tablice haszujące
❙ $a['test']=”tekst”; // pole ”test” ma wartość ”tekst”
Zmienne tablicowe
❚ Wypełnianie tabel
# Przykład 1:
# Przykład 2:
$a["color"] = "red";
$a = array(
$a["taste"] = "sweet";
"color" => "red", $a["shape"] = "round";
"taste" => "sweet", $a["name"] = "apple";
"shape" => "round", $a[3] = 4;
"name" => "apple", 3 => 4
);
Zmienne tablicowe
<?php
$a = array(
"banana" => array(
"apple" => array(
"color" =>"yellow",
"color" => "red",
"taste" =>"paste-y",
"taste" => "sweet",
"shape" => "banana"
"shape" => "round"
)
),
);
"orange" => array(
"color" =>"orange",
"taste" => "tart", echo $a[apple][taste];
"shape" => "round"
// wynik będzie "sweet"
),
?>
Obiekty - Klasy
❚ Klasy są elementem
<?php
programowania
class blep {
obiektowego
function blepuj() {
echo ”robie blep.";
❚ Klasa składa się z
}
danych i metod
}
operujących na tych
$b = new blep;
danych (funkcji)
$b->blepuj();
?>
❚ Aby użyć
zdefiniowanej klasy
❚ funkcja, której nazwa
należy ją
jest nazwą klasy jest
zainicjalizować (new)
konstruktorem klasy
Obiekty - Klasy
❚ Konstruktory używane są do inicjalizacji zmiennych i innych obiektów, jeżeli nie jest zadeklarowany, używany jest nie jawny
❚ Obiekty w PHP nie posiadają jawnego destruktora
❚ Wszystkie zmienne i funkcje klasy dostępne są publicznie tzn. można je wywołać $a->d; $a->f(); nie ma prywatnych, i chronionych jak w C++
Zmienne środowiskowe
❚ zmienne środowiskowe systemu operacyjnego
❙ zmienne zdefiniowane w systemie operacyjnym przed wywołaniem skryptu CGI lub serwera np. PATH itp..
❚ zmienne serwera (Apache)
❙ Pozwalają na dostęp do zmiennych zdefiniowanych przez serwer np. wersja serwera wersja przeglądarki klienta, zmiennych HTTP itp.
❙ od PH5 ( poprzez tablicę $_SERVER[])
❚
GATEWAY_INTERFACE, SERVER_NAME, SERVER_SOFTWARE, SERVER_PROTOCOL, REQUEST_METHOD, QUERY_STRING, DOCUMENT_ROOT, HTTP_ACCEPT, HTTP_ACCEPT_CHARSET, HTTP_ACCEPT_ENCODING, HTTP_ACCEPT_LANGUAGE, HTTP_CONNECTION, HTTP_HOST, HTTP_REFERER, HTTP_USER_AGENT, REMOTE_ADDR, REMOTE_PORT, SCRIPT_FILENAME, SERVER_ADMIN, SERVER_PORT, SERVER_SIGNATURE, PATH_TRANSLATED, SCRIPT_NAME, REQUEST_URI
Zmienne z poza PHP
❚ Zmienne zwracane przez cookies
przeglądarki
❙ nazwa zmiennej php jest identyczna z tą zapisaną w cookies jeżeli nie zawiera „.”, która jest zamieniana na „_”
❚ zmienne przekazywane jako parametry
wywołania http przez metody POST lub GET
❙ „.” jest zamieniana na „_”
http://localhost/skrypt.php?blep=a&a=1;
❙ powoduje inicjalizację zmiennch $blep wartością „a” oraz zmiennej $a=1 (lub $_GET['a'])
Zmienne z poza PHP
❚ Zmienne z formularza WWW
<form method=”post” action=”skrypt.php”>
<input type=”text” name=”okienko”>
<input type=”submit” name=”przycisk” value=”przycisk”>
</form>
❙ naciśniecie przycisku „przycisk” w formularzu powoduje przekazanie zmiennych do skryptu php „skrypt.php”
❘ $okienko - zostanie zainicjalizowane wartością wpisaną w pole edycyjne okienko w formularzu
❘ $przycisk będzie miała wartość „przycisk”
Zmienne z poza PHP
❚ Zmienne z formularza WWW
<form method=” post” action=”skrypt.php”>
<input type=”text” name=”nazwisko” />
<input type=”text” name=”imie” />
<input type=”text” name=”rok_ur” />
<input type=”image” src="https://zanotowane.pl/14/7130/image.gif" name="sub" />
</form>
❙ naciśniecie przycisku „przycisk” w formularzu powoduje przekazanie zmiennych do skryptu php „skrypt.php”
❘ W nowszych wersjach PHP dla bezpieczeństwa wartości przekazanych zmiennych są w tablicach
• $_GET – dla metody HTTP GET
• $_POST – dla metody HTTP POST
• $_POST['nazwisko'] lub $_GET['nazwisko'] zawiera wpisane nazwisko
• $_POST['imie'] lub $_GET['imie']
• $_POST['rok_ur'] lub $_GET['rok_ur'] ...
Przestrzenie nazw
zmiennych
❚ zmienne mają możliwie najmniejszy zasięg
❙ zmienna zdefiniowana w obrębie funkcji, klasy, czy instrukcji grupującej ({}) mają zasięg
ograniczony do tych elementów
<?php
function blep() {
$a=10;
};
for($a=1; $a<10; $a++){
echo $a; // to jest inne $a
}
echo $a; //zmienna $a nie jest zdefiniowana
?>
Użycie zmiennych
❚ Zmienna odwołująca się do innej zmiennej -
odwołanie przez adres
<?php
$a=1;
$b=&$a; //operacje na zmiennej $b są
//równoznaczne z operacjami na $a
?>
Użycie zmiennych
❚ Zmienna odwołująca się do innej zmiennej -
odwołanie przez nazwę
❙ nazwa do której się odwołujemy musi być nazwą istniejącej zmiennej
<?php
$a=”hello”;
$$a=”world”;
echo ”$a $hello”; // wynik „hello world”
?>
Konwersja typów
❚ Jeżeli pierwsza zmienna jest łańcuchem
znakowym wynik operacji zależny jest od
drugiej zmiennej - konwersja niejawna
$a=”1”;
$b=10.1
$c=$a+$b// wynik jest liczbą zmiennoprzecinkową 11.1
❚ Jawna konwersja
$a=1; //$a jest typu całkowitego
$b=double( $a ) // $b jest l. zmiennoprzecinkową
Zmienne globalne
❚ Zmienne środowiskowe, serwera i wszelkie
pochodzące są zmiennymi globalnymi
❚ użycie zmiennych globalnych w funkcjach, klasach i modułach musi być jawnie zdefiniowane
$a = 1; $b = 2;
Function Sum () {
$GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"]; }
Sum (); echo $b; // wynik 3
$a = 1; $b = 2;
Function Sum () {
global $a,$b;
$b=$a+$b;}
Sum (); echo $b; // wynik 3
Zmienne globalne
❚ Nową zmienną globalną można zadeklarować w każdym momencie poprzez „global”
$a = 1; $b = 2; // początkowo $c nie istnieje function Sum () {
global $a,$b $c; // $c jest nową zmienną glbalną $c=$a+$b;
}
Sum (); echo $c; // wynik 3 - $c pozostaje globalną
Zmienne w obiektach
❚ W ramach obiektu klasy można zdefiniować
zmienne
❚ dostęp do tych zmiennych w ramach obiektu
następuje przez zmienną $this co oznacza ten sam obiekt
class blep {
var $a; //definiujemy $a w obrębie obiektu function blep() {
$this->a=10; przypisujemy zmiennej $a obiektu 10
}
}
Funkcje
❚ Funkcję można zdefiniować w dowolnym
momencie, ciało funkcji zamykają „{ }”
<?php
...
...
function a() { // a nazwa funkcji
return 5; //wartość zwracana przez funkcję
}
...
?>
❚ Funkcja nie musi zwracać wartości
function a() {
//... Lista instrukcji
}
Funkcje
❚ Argumenty funkcji mogą być predefiniowane
<?php
function a($arg1=0, $arg2=1) {
return $arg2;
}
echo a(); // oba argumenty mają wartości domyślne echo a(1); // $arg2 ma wartość domyślną 1
echo a(1,3); // $arg2 ma wartość 3
?>