To interpretowany skryptowy język programowania zaprojektowany do generowania stron internetowych i budowania aplikacji webowych w czasie rzeczywistym.
PHP jest najczęściej stosowany do tworzenia skryptów po stronie serwera WWW, ale może być on również używany do przetwarzania danych z poziomu wiersza poleceń, a nawet do pisania programów pracujących w trybie graficznym (np. za pomocą biblioteki GTK+, używając rozszerzenia PHP-GTK). Implementacja PHP wraz z serwerem WWW Apache oraz serwerem baz danych MySQL określana jest jako platforma AMP (w środowisku Linux – LAMP, w Windows – WAMP).
Możliwości
Skrypty napisane w PHP są z reguły umieszczane w plikach tekstowych (czasami razem z kodem HTML lub XHTML). Dzięki temu PHP jest podobny w założeniach do coraz rzadziej stosowanego mechanizmu Server Side Includes[5]. PHP pozwala także na wykonywanie skryptów z linii poleceń podobnie jak Perl, Python oraz Ruby. Jego modułowa budowa daje również możliwość programowania samodzielnych aplikacji z interfejsem graficznym. PHP umożliwia współpracę z wieloma rodzajami źródeł danych, takich jak systemy zarządzania bazami danych, pliki tekstowe, dokumenty XML oraz serwisy WWW.
Przykład użycia PHP na stronie
<html>
<head>
</head>
<body>
<?php echo '<p>Hello World</p>' ; ?>
</body>
</html>
Moduły
Cała funkcjonalność PHP zawarta jest w czterech zbiorach modułów różniących się od siebie dostępnością dla programisty.
- Moduły jądra
- Część silnika PHP; zawsze aktywne.
- Moduły oficjalne
- Element każdej dystrybucji PHP; aktywowane ręcznie przez administratora serwera.
- Repozytorium PECL
- Darmowe moduły o otwartym źródle tworzone przez programistów z całego świata, przeznaczone do samodzielnej kompilacji. Począwszy od wydania PHP 5 do PECL przeniesionych zostało wiele wcześniejszych modułów oficjalnych, najczęściej tych niestabilnych lub rzadko używanych.
- Repozytorium PEAR
- Zbiór realizujący typowe zadania klas o ujednoliconej budowie.
Zdecydowana większość modułów ma budowę proceduralną. Dopiero w PHP 5 rozpoczęto tworzenie w pełni obiektowych rozszerzeń oraz obiektowych zamienników starych funkcji.
Składnia języka PHP
Składnia PHP jest zapożyczona ze składni języków C, Java oraz Perl.
<?php
$a = 5;
$b = 3;
function suma($zmienna1, $zmienna2)
{
$wynik = $zmienna1 + $zmienna2;
return $wynik; //Dodajemy argumenty i zwracamy wynik
}
echo suma($a, $b); // 8
?>
Cały kod PHP musi zawierać się pomiędzy znacznikami:
<?php oraz ?> – jedyny nieskrótowy tag zalecany przez PSR-1[24], wymienione jako dozwolone w podręczniku php.net[25]; PSR-2 nakazuje ominięcie znacznika końcowego, jeśli plik zawiera tylko kod PHP, a na końcu pliku musi zostać jedna, pusta linia[26], z kolei php.net jedynie zaleca ominięcie końcowego tagu, w takim przypadku[25]
<? oraz ?> – niezalecane przez php.net z powodu mniejszej kompatybilności (wymaga włączenia short_open_tag)[25]; użycie zabronione przez PSR-1[24], mimo warunkowego zezwolenia przez podręcznik php.net[25]
<?= oraz ?> – powoduje wysłanie tekstu na wyjście (np. <?=$zmienna ?> i ma taki sam wynik (tj. skrócona notacja) jak <?php echo $zmienna; ?>); jedyny skrótowy tag zalecany przez PSR-1[24] – nie mylić z dopuszczeniem <? oraz ?>; nie wymaga włączenia short_open_tag w wersjach PHP 5.4 i późniejszych[27]
<% oraz %> – tagi w stylu ASP; wymaga włączenia asp_tags[28] (usunięto w PHP 7)
<%= oraz %> – analogiczny efekt do <?= oraz ?>[28] (usunięto w PHP 7)
<script language="php"> oraz </script> – case insensitive, wprowadzone dla kompatybilności z niektórymi edytorami HTML[27] (usunięto w PHP 7)
Przykładowe zastosowanie
Niektóre aplikacje napisane w PHP korzystają z formularzy. Przykładowa aplikacja przypominająca prosty kalkulator została zamieszczona poniżej:
<?php
if (isset($_POST['licz'])) {
$liczba_a=floatval($_POST['a']); // Konwersja na liczbę zmiennoprzecinkową
$liczba_b=floatval($_POST['b']);
echo "Chcesz obliczyć sumę następujących liczb:" . "<br />" . "<b>";
print_r($liczba_a);
echo "</b>" . "<br />" . "Oraz:" . "<br />" . "<b>";
print_r($liczba_b);
echo "</b>" . "<hr />";
echo "Ich suma to:" . " <b>";
$wynik = $liczba_a + $liczba_b;
echo $wynik;
echo "</b>";
} else {
echo "Wpisz liczby.";
}
?>
<!-- Poniżej znajduje się sam formularz -->
<form action="<?php echo ($_SERVER['SCRIPT_NAME']); ?>" method="POST">
Podaj dwie liczby:<br />
Liczba A: <input name="a" /><br />
Liczba B: <input name="b" /><br />
<input type="submit" name="licz" value="Oblicz!" />
</form>
Ze względów bezpieczeństwa powinno się stosować $_SERVER['SCRIPT_NAME'] zamiast $_SERVER['PHP_SELF'] (użycie tego drugiego może grozić atakami XSS).
Klasy i obiekty
Klasy deklarujemy następująco (od PHP5):
<?php
class MojaKlasa
{
public $zm_publiczna; //definiowanie zmiennej publicznej
private $zm_prywatna; //definiowanie zmiennej prywatnej
protected $zm_chroniona; //definiowanie zmiennej chronionej
const STALA = 124; //definiowanie stałej, stała musi zostać określona (jeśli nie - błąd składni)
public function __construct()
{
echo 'Jestem konstruktorem klasy MojaKlasa. Za każdym razem gdy powołasz mój obiekt do życia, wykonam operacje zawarte w tej metodzie.<br />';
}
public function zrob_cos()
{
echo 'Właśnie wykonywana jest funkcja zrob_cos()<br />';
}
public function __destruct()
{
echo 'Jestem destruktorem klasy MojaKlasa. Za każdym razem gdy usuniesz mój obiekt, wykonam operacje zawarte w tej metodzie.<br />';
}
}
$mojobiekt = new MojaKlasa(); //powoła do życia obiekt i wykona operacje zawarte w funkcji __construct()
$mojobiekt -> zrob_cos(); // Wydrukuje komunikat
//kiedy kończy się kod PHP, wszystkie zmienne są usuwane; wywoływana jest funkcja __destruct()
?>
Komentarze
Rozróżniamy trzy typy komentarzy: Pierwszym z nich jest wieloliniowy:
<?php
/* To jest komentarz
wieloliniowy, zamykany znacznikiem:
*/
?>
Kolejnym jest jednoliniowy:
<?php
//to jest komentarz jednoliniowy, który nie potrzebuje zamknięcia
?>
Ostatnim jest jednoliniowy (w innej wersji):
<?php
# to jest komentarz jednoliniowy, który nie potrzebuje zamknięcia
?>
<?php function foo(&$value) { $value = 'bar'; } ?>
Klasy i obiekty
Elementy programowania obiektowego pojawiły się w PHP 3. W PHP 4 udostępniono statyczne wywoływanie metod. W PHP 5 możliwości zostały rozszerzone między innymi o statyczne zmienne klasy, obsługę interfejsów, kontrolę dostępu, kontrolę typów czy klasy i metody abstrakcyjne. Model PHP wzoruje się na językach C++ i Java. Od wersji 5 PHP posiada mechanizmy refleksyjne[29], które pozwalają na analizę klas, funkcji oraz rozszerzeń. Bez zainstalowania odpowiedniego rozszerzenia nie umożliwiają one jednak zmiany tych struktur w czasie wykonywania, przykład klasy:
<?php
class Przyklad
{
public function powiedzCzesc($imie)
{
return 'Cześć, ' . $imie;
}
}
$objPrzyklad = new Przyklad ();
echo $objPrzyklad->powiedzCzesc ( 'Adam' );
?>
Funkcje i struktury kontrolne
PHP jest wyposażone w szeroki wachlarz domyślnych funkcji. Niekonsekwencja w ich nazewnictwie (np. naprzemienne stosowanie CamelCase i znaku podkreślenia) jest niekiedy przedmiotem krytyki PHP. Znaczna część funkcji pochodzi jednak od ich odpowiedników w języku C i różnice pomiędzy nazwami funkcji wywodzą się właśnie z różnic w nazewnictwie z odpowiednich bibliotek C.
PHP obsługuje rekurencję do poziomu około stu zagłębień. Jeśli stos parsera zostanie przeciążony nadmierną ilością wywołań lub iteracji, wywołanie aplikacji zostanie przerwane.
Obsługa błędów
Wersja 5 wprowadziła mechanizm wyjątków. Tylko część modułów powiadamia jednak użytkownika o wystąpieniu błędów za ich pośrednictwem; większość umieszcza je na wyjściu programu w miejscu ich wystąpienia. Przykład:
<?php
class Foo
{
private $zmienna;
public function setZmienna($cos)
{
$this->zmienna = $cos;
}
public function getZmienna()
{
if (empty ( $this->zmienna ))
{
throw new Exception ( 'Proszę ustawić zmienną' );
}
return $this->zmienna;
}
}
try
{
$objFoo = new Foo ();
print $objFoo->getZmienna ();
} catch ( Exception $e )
{
die ( 'Wystąpił błąd: ' . $e->getMessage () );
}
?>
Obsługa baz danych
PHP obsługuje większość znanych baz danych: MySQL, PostgreSQL, Oracle, MS SQL, DB2. Poniżej przedstawiono wykonanie zapytania SQL na bazie danych MySQL przy pomocy biblioteki PDO dla PHP5:
<?php
try
{
$pdo = new PDO ( 'mysql:host=localhost;dbname=articles', 'root', 'root' );
$pdo->setAttribute ( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$stmt = $pdo->query ( 'SELECT id, name, content FROM articles ORDER BY id' );
echo '<ul>';
foreach ( $stmt as $row )
{
echo '<h1>' . $row ['name'] . '</h1>';
echo $row ['content'] . '<hr />';
}
$stmt->closeCursor ();
echo '</ul>';
} catch ( PDOException $e )
{
echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage ();
}
?>
Popularność
W roku 1997 język PHP/FI obsługiwało około 50 tysięcy domen internetowych. Do roku 2005 udział PHP rósł. Później uległ stabilizacji na poziomie ok. 20 milionów domen[6][30] (9% wszystkich)[31]. Obecnie jest dominującym językiem programowania i obejmuje około 75% domen internetowych[32].
Aplikacje
W PHP powstała znaczna część obecnie istniejących aplikacji sieciowych. Należą do nich systemy zarządzania treścią, systemy forów dyskusyjnych, aplikacje pocztowe oraz klienty baz danych.