PHP

PHP (ang. PHP Hypertext Preprocessor, akronim rekurencyjny; początkowo rozwijany jako Personal Home Page) – skryptowy język programowania służący przede wszystkim do tworzenia dynamicznych stron WWW i wykonywany w tym przypadku po stronie serwera, z możliwością zagnieżdżania w HTML (bądź XHTML). PHP jest podobny w założeniach do dużo starszego mechanizmu SSI (ang. Server Side Includes), jednak jest w stosunku do SSI nieporównanie bardziej rozbudowany. Udostępniany jest na zasadach licencji open source. Jego składnia bazuje na językach C, Java i Perl.

PHP może być używane nie tylko do tworzenia stron WWW. Jego modułowa budowa pozwala także na programowanie aplikacji z interfejsem graficznym (rozszerzenie PHP-GTK), a także na wykonywanie z linii poleceń (podobnie jak Perl i Python).

PHP umożliwia także współpracę z wieloma systemami relacyjnych baz danych (np. MySQL, Oracle, PostgreSQL, SQLite) oraz korzystanie z alternatywnych sposobów przechowywania danych – plików tekstowych i XML-owych. Może być uruchamiane na większości systemów operacyjnych (uwzględniając najpopularniejsze) oraz serwerów sieciowych.

Implementacja PHP w środowisku Linux wraz z serwerem Apache i silnikiem baz danych MySQL stanowi popularną platformę serwerową, tzw. LAMP.

Historia

 PHP/FI

Pierwsza wersja PHP, rozpowszechniana pod nazwą PHP/FI (Personal Home Page/Forms Interpreter), została stworzona przez Rasmusa Lerdorfa w roku 1994 jako zestaw skryptów Perla służący do monitorowania internautów odwiedzających jego witrynę. Gdy ruch stał się zbyt duży, przepisał je w języku C, dodając przy tym nowe opcje. Niedługo później ludzie zaczęli prosić go o możliwość użycia tych narzędzi na swoich stronach, zatem 8 czerwca 1995 roku autor udostępnił publicznie kod źródłowy (PHP Tools 1.0). Już kilka miesięcy później projekt przekształcił się w zalążek znanego obecnie języka programowania, gdy został połączony z innym narzędziem Rasmusa LerdorfaForm Interpreter, które dało drugi człon nazwy. W 1997 roku pojawiło się PHP/FI 2.0, posiadające wtedy kilka tysięcy aktywnych użytkowników na całym świecie oraz obsługujące 50 tys. domen. Co ciekawe, wersja ta spędziła większość "życia" na beta testach. Oficjalne wydanie było tylko jedno i ukazało się w listopadzie 1997 roku.

 PHP 3

W 1997 roku projektem zainteresowali się dwaj izraelscy programiści: Zeev Suraski i Andi Gutmans. Odkryli oni, że PHP/FI ma zbyt małe możliwości jak na potrzeby aplikacji eCommerce, którą tworzyli na uniwersytecie. Zdecydowali wtedy, że przepiszą kod PHP całkowicie od nowa, korzystając z pomocy już istniejącej społeczności PHP. W czerwcu 1998 roku ogłosili PHP 3.0 jako następcę PHP/FI, którego dalszy rozwój został wtedy zatrzymany. Był to wielki krok naprzód. PHP 3.0 posiadało całkowicie nową architekturę, która znacznie zwiększała wydajność. Pojawiły się w niej zalążki programowania obiektowego, ale najważniejszą cechą aplikacji była jej modułowość. Użytkownicy mogli rozszerzać teraz funkcjonalność języka poprzez dodawanie nowych modułów.

 PHP 4

Krótko po wydaniu PHP 3, w zimie 1998 Zeev Suraski oraz Andi Gutmans jeszcze raz zabrali się za przepisywanie kodu źródłowego PHP, korzystając z doświadczeń nabytych przy pracach nad poprzednią wersją. Za główne cele obrali poprawienie modułowości oraz wydajności złożonych aplikacji. Choć dotychczasowa wersja potrafiła sobie z nimi poradzić, nie była jednak stworzona do tego celu i przegrywała przez to z innymi rozwiązaniami.

W połowie roku 1999 ukazał się oficjalnie Zend Engine, nowy silnik języka skryptowego, wokół którego niedługo później zaczęto budować PHP 4. Jego nazwa to kompromisowe połączenie imion twórców projektu. Nowa, oparta o niego wersja PHP ukazała się w maju 2000 roku. Tak jak poprzednio, był to potężny krok naprzód. Programiści mieli do dyspozycji teraz wiele nowych narzędzi, konstrukcji językowych oraz bezpieczniejszy system wejścia/wyjścia. Od strony administracyjnej pojawiło się oficjalne wsparcie dla wielu nowych serwerów. Przez cztery lata od chwili wydania ukazały się trzy kolejne edycje tej wersji oznaczone numerami: 4.1, 4.2 oraz 4.3. W każdej z nich odczuwalne było zwiększenie bezpieczeństwa, szybkości działania oraz możliwości. W 2004 roku obsługiwały one łącznie 20% wszystkich domen sieciowych. Również obecnie, dwa lata po premierze PHP 5, "czwórka" jest bardzo chętnie wykorzystywana przez administratorów ze względu na dużą stabilność.

 PHP 5

W 2002 roku Zeev Suraski oraz Andi Gutmans ponownie rozpoczęli znaczącą modernizację silnika PHP mającą na celu dodanie do tego języka modelu obiektowego na poziomie dorównującym innym, w pełni obiektowym językom. W lutym 2003 ukazała się pierwsza wersja alpha nowej wersji PHP oznaczonej numerem 5.0.0. Stabilna wersja ukazała się prawie półtora roku później, w lipcu 2004 roku. Nowości sprawiły, że PHP stał się rozsądną alternatywą wobec innych nowoczesnych rozwiązań server-side.

Pojawił się całkowicie nowy model programowania obiektowego co spowodowało utratę pełnej kompatybilności z poprzednimi wersjami PHP. W ramach tego modelu, zmieniony został sposób reprezentacji obiektów. W wersjach wcześniejszych obiekt był jednocześnie zmienną, co sprawiało duże trudności, dlatego też w wersji 5 na wzór Javy zmienna obiektowa stała się jedynie referencją do właściwego obiektu. Operacja przypisania (=) powoduje jedynie powstanie drugiej referencji wskazującej na ten sam obiekt.

Funkcje obsługi języka XML zostały napisane na nowo i wbudowane bezpośrednio w jądro aplikacji. Jednocześnie oprócz modelu DOM udostępniono SimpleXMLinterfejs do zarządzania dokumentami w tym języku.

Z powodu zmian licencji autorzy musieli usunąć z kodu własną bibliotekę do komunikacji z bazą MySQL. W związku z tym rozszerzenie MySQL nie jest już wkompilowywane domyślnie – należy je ręcznie doinstalować, korzystając z dostarczonej przez MySQL biblioteki libmysqlclient. Zmiana ta dotyczy również PHP 4. W zamian udostępniono nowy, domyślnie wkompilowany silnik baz danych – SQLite – którego cechą jest to, iż nie wymaga żadnych dodatkowych programów. Biblioteka kliencka jest jednocześnie jego serwerem.

24 listopada 2005r. ukazała się wersja PHP 5.1, w której pojawił się z dawna oczekiwany, wbudowany sterownik baz danych, oraz dodano możliwość wymuszenia tablicy jako typu parametru funkcji – jeśli funkcja korzystająca z tej możliwości otrzyma w takim parametrze zmienną innego typu, interpreter PHP zgłosi błąd krytyczny.

 PHP 6

W połowie roku 2005 zaczęły pojawiać się oficjalne sygnały, że rozpoczęto wstępne prace nad PHP 6. W stanie na lipiec 2006 wersja ta znajduje się w fazie produkcyjnej (dostępne są publiczne obrazy PHP w wersji źródłowej oraz binarnej dla systemów Windows). Lista TODO obejmuje:

 Moduły PHP

Cała funkcjonalność PHP zawarta jest w czterech zbiorach modułów różniących się dostępnością.

Zdecydowana większość modułów ma budowę proceduralną. Dopiero od PHP 5 rozpoczęto tworzenie w pełni obiektowych rozszerzeń oraz obiektowych zamienników starych funkcji.

Lista funkcji jądra obejmuje w PHP 5.1:

Poniższe moduły są domyślnie aktywne przy instalacji, lecz można je wyłączyć:

Wśród oficjalnych modułów, które trzeba samodzielnie aktywować, znajdują się sterowniki do wszystkich popularnych baz danych (w wersji samodzielnej oraz dla PDO), płatności elektronicznych, a także między innymi:

W repozytorium PECL znaleźć można moduły do obsługi innych formatów kompresji (np. RAR i ZIP), darmowy kompilator kodu bajtowego dla PHP i wiele innych rozszerzeń.

 Przykłady kodu źródłowego

Standardowe "Hello world!":

<?php
  echo 'Hello world!';
?>

Komentarze:

<?php
  // To jest komentarz, którego koniec to ostatni znak w tej linii
  # To komentarz podobny do powyższego
  /* To komentarz,
    Który kończy
    się tutaj */
?>

Użycie zmiennych w PHP:

<?php
  
  $czas = 86400;
  echo $czas.' sekund to '.($czas / 60).' minut<br/>';
  echo $czas.' sekund to '.($czas / 3600).' godzin<br/>';
?>

Przykładowa funkcja w PHP:

<?php
  function hello() {
    return 'Hello world!';
  }
  echo hello();
?>

Przykładowe połączenie z bazą danych (MySQL) w PHP 5.1 poprzez bibliotekę PDO oraz zwrócenie wszystkich danych z jednej kolumny na ekran:

<?php
   try
   {   
      $pdo = new PDO('mysql:host=localhost;dbname=bazadanych', 'uzytkownik', 'haslo');
      $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      
      $stmt = $pdo -> query('SELECT kolumna FROM tabela');
      $stmt -> setFetchMode(PDO::FETCH_ASSOC);
 
      foreach($stmt as $row)
      {
         echo $row['kolumna'];      
      }
      $stmt -> closeCursor();
   }
   catch(PDOException $e)
   {
      echo 'Błąd bazy danych: ' . $e->getMessage();
   }
?>

PHP dopuszcza tworzenie nieskończonych pętli, dlatego też uruchomiony kod może sprawiać wrażenie, że skrypt uległ zawieszeniu:

<?php
  while (1) { // wykonuje w pętli blok instrukcji dopóki, dopóty warunek jest prawdziwy
  }
?>

PHP obsługuje także rekurencję do poziomu około stu zagłębień (zależne od możliwości hosta i stopnia komplikacji kodu). Jeśli stos parsera zostanie przeciążony nadmierną ilością wywołań, aplikacja zostanie przerwana:

<?php
  function foo() {
    return foo();
  }
  foo();
?>

 Typy danych w PHP

Zmienne w PHP nie mają jawnych typów – zmienna o jednej nazwie może być traktowana w czasie działania programu raz jako liczba, raz jako łańcuch znaków, a rozróżnienia dokonuje się w zależności od kontekstu i użytych operatorów. Obie poniższe operacje są prawidłowe:

$a = 3;
$b = 2;
echo($a.$b); // wyświetlony zostanie ciąg znaków "32"
echo($a+$b); // wyświetlona zostanie liczba 5

Aktualny typ zmiennej PHP można sprawdzać funkcjami: is_float(), is_int(), is_bool(), is_null(), is_object(), is_array(), is_resource(), a także gettype(), która to zwraca z postaci stringu typ zmiennej.

Wśród obsługiwanych typów danych są:

$zmienna = 'tekst';
$napis1 = "Jakiś $zmienna";
echo($napis1); // wyświetli: Jakiś tekst 
$napis2 = 'Jakiś $zmienna';
echo($napis2); // wyświetli: Jakiś $zmienna
$liczba  = 123;
$liczba = 0x7b;
$liczba = 0173;
$liczba = 123.00;
$bool = true;
$bool = false;
$null = NULL;
$tablica = array('raz', 2, 'trzy');
echo($tablica[2]); // wyświetli: trzy
$tablica = array('indeks1' => 1, 'indeks_drugi' => 'dwa');
echo($tablica['indeks_drugi']); // wyświetli: dwa
$obiekt = new klasa;
$obiekt->właściwość = $obiekt->metoda();
$wskaźnik = &$zmienna;
$wskaźnik2 = &$tablica[1];

 PHP a programowanie obiektowe

Elementy programowania obiektowego pojawiły się już w PHP 3 lecz nie pozwalały one rozwinąć skrzydeł programistom. Brakowało wielu istotnych elementów a kod nie był zoptymalizowany. Sytuacja całkowicie uległa zmianie w PHP 5 – dodano wiele istotnych rzeczy m.in. interfejsy, kontrolę dostępu czy klasy abstrakcyjne. Model OOP wzorowany jest na językach C++ i Java.

<?php
 
  interface zwierze{
    public function imie();
    public function dajGlos();
  }
 
  class pies implements zwierze{
    private $imie;
 
    public function __construct($imie){
      $this -> imie = $imie;
    }
 
    public function imie(){
      return $this -> imie;
    }
 
    public function dajGlos(){
      echo 'Hau hau';
    }
  }
 
  $zwierzak = new pies('Azor');
  echo $zwierzak->imie() . ', daj głos!';
  $zwierzak -> dajGlos();
?>

Nowopowstające rozszerzenia mają już obiektową budowę.

 OOP w PHP 5

 Nowe metody

PHP 5 dodało nowe metody do klas. Metody __toString, __call, __get i __set są obecnie testowane, dają wiele możliwości, lecz jeszcze nie wiadomo czy tak naprawdę się przyjmą. Istotną zmianą jest również sposób przekazywania obiektów. Obecnie są one zawsze przekazywane przez referencję. Stąd wersje 4 i 5 nie są do końca kompatybilne.

__toString() metoda bezparametrowa, bardzo przydatna, jeżeli chcemy mieć łatwy dostęp do danych zawartych w obiekcie.

<?php
class TestToString
{
  private $nazwa = "";
  public function __construct($nazwa)
  {
   $this->nazwa = $nazwa;
  }
  
  public function __toString()
  {
    return $this->nazwa;
  }
}
 
$obiekt = new TestToString("Obiekt nr 1");
echo $obiekt;
 
?>

__construct() konstruktor, metoda wywoływana podczas tworzenia obiektu. Parametry podane w tej metodzie będą wymagane podczas tworzenia obiektu – (w PHP 3 i 4 konstruktorem była metoda nazywająca się tak samo jak nazwa klasy)

__destruct() zdarzenie destruktora, to zdarzenie wykonuje się przed zniszczeniem obiektu

__call() metoda dwuparametrowa, pierwszy parametr to nazwa metody a drugi to jej parametry, metoda wykonuje się w czasie, gdy operujemy na metodzie nieznajdującej się w obiekcie.

__get() metoda jednoparametrowa, jej parametr to nazwa pola, którego nie ma w obiekcie, a była próba odczytania jej wartości

__set() metoda dwuparametrowa, gdzie pierwszy parametr to nazwa pola a drugi to wartość przypisana, metoda ta wykonywana jest w momencie, gdy chcemy przypisać wartość do pola, które nie zostało zawarte w obiekcie.

__clone() metoda wykonywana podczas klonowania obiektu (tzw. konstruktor kopiujący), daje nam możliwość zmodyfikowania sklonowanego obiektu, metodę warto użyć, jeżeli potrzebujemy kopii obiektu i w kopii od razu chcemy przeprowadzić jakąś niewielką zmianę.

__unset() metoda uruchamiana podczas gdy używamy unset() na właściwości obiektu.

__isset() metoda uruchamiana podczas gdy używamy isset() na właściwości obiektu.