Język programowania PHP
PHP, którego nazwa pochodzi od słów “Hpertext Preprocessr”, to interpretowany, skryptowy język programowania, wykorzystywany głównie do tworzenia dynamicznych aplikacji internetowych. Około ¾ istniejących stron internetowych wykorzystuje PHP, między innymi poprzez użycie WordPressa, MediaWiki, Joomla, Drupal czy Magento. Swoją ogromną popularność PHP zawdzięcza niskiemu progowi wejścia, szybkim efektom oraz gigantycznej liczbie bibliotek i gotowych rozwiązań do wykorzystania. W rezultacie język, który swoje początki miał w 1994 r., cały czas pozostaje częstym wyborem w budowaniu nowych dedykowanych aplikacji webowych.
Nasze usługi programistyczne w PHP


Zazwyczaj do nowych aplikacji webowych używamy Laravel'a. W przypadku dużych rozproszonych systemów lub wymagających więcej fine-tuningu korzystamy również z Symfony.

Wykonujemy refaktoring istniejącego kodu oraz przeprowadzamy aktualizację wersji PHP i frameworków w zastanych projektach.

Optymalizujemy działanie i poprawiamy wydajność systemów napisanych w PHP. Jedną z takich optymalizacji wykonaliśmy dla Nowy Bank, gdzie przyspieszyliśmy kluczowy procesy w systemie klienta ponad 100-krotnie.

Wykonujemy audyty oprogramowania. W zależności od potrzeby dotyczą one: bezpieczeństwa, kompletności rozwiązania, jakości kodu źródłowego, potencjału do rozwoju oraz architektury.

W zależności od potrzeb klienta możemy całkowicie przejąć rozwój systemu, jak również doradzić i wspólnie z zespołem wewnętrznym zaplanować rozwiązanie istniejących problemów. W ten sposób wspomogliśmy między innymi Adamed w zaprojektowaniu architektury dedykowanego systemu.
Spis treści:
Zalety PHP
Open-Source z olbrzymią społecznością

PHP, będąc rozwiązaniem open-source, skupia wokół siebie ogromną społeczność tworzącą darmowe narzędzia i biblioteki. Do wielu zastosowań można znaleźć gotowe rozwiązanie, które realizuje większość funkcjonalności, na podstawie którego w ramach licencji open-source doświadczony zespół PHP może zbudować kompleksowy system rozwiązujący każdy problem biznesowy.
Oczywiście można również spotkać płatne wiodące rozwiązania, ale dla większości z nich istnieje kilka darmowych, równie dobrych, alternatyw. Dodatkowo olbrzymia społeczność programistów PHP pozostawia po sobie liczne wpisy na forach, które pomagają w rozwiązywaniu również tych rzadziej spotykanych problemów.
Szybkość i skalowalność

PHP oferuje wysoką skalowalność dzięki licznym wbudowanym narzędziom optymalizacyjnym. Od wersji 8 sam język i środowisko zostały niezwykle zoptymalizowane pod względem ilości wykonywanych operacji przez procesor.
Przykładowo wąskie gardła (z ang. bottleneck), czyli wolniejsze, czy bardziej skomplikowane fragmenty kodu, są tłumaczone na kod maszynowy, który jest najoptymalniejszym sposobem wykonywania poleceń, i wykonywane z pominięciem maszyny wirtualnej, co znacząco poprawia szybkość języka. Także wbudowane buforowanie kodu oraz kompilacja Just-In-Time umożliwia osiąganie wydajności zbliżonej do języków kompilowanych.
Różnorodne mechanizmy buforowania, dostępne na każdym poziomie: od komunikacji z bazą danych, przez klienta (przeglądarkę), serwer (buforowanie odpowiedzi), aż po aplikację (np. pamięć podręczna) – dodatkowo usprawniają działanie aplikacji. Wszystko to sprawia, że stworzenie wysoce skalowalnych aplikacji jest znacznie ułatwione.
Niezależność od platformy i bazy danych

Aplikacje napisane w PHP co do zasady są multi platformowe i mogą być uruchamiane na różnych systemach. Również masa bibliotek zapewnia wielosystemowość.
Technologie PHP nie faworyzują żadnej z baz danych i oferują podobny poziom wsparcia dla każdej z technologii. Dostępne są zarówno pełno prawne ORM jak i narzędzia do bezpośredniego wykonywania zapytań na bazie.
Prostota i łatwość startu

Najprostszym przypadkiem użycia PHP jest osadzenie w statycznym HTML-u fragmentu skryptu, który generuje dynamiczne dane, na przykład pobrane z bazy danych, a wszystko to w kilku linijkach kodu i najczęściej bez potrzeby dodatkowej konfiguracji serwera-hostingu (domyślna konfiguracja i najczęściej bez potrzeby dodatkowej konfiguracji serwera-hostingu (domyślna konfiguracja dla HTML z PHP wystarcza).
Tak niski próg wejścia sprawia, że po PHP sięgają początkujący programiści lub nawet pracownicy działów IT i biznesowych, czy pracownicy naukowi, którzy zostali poproszeni o stworzenie "prostego narzędzia". Projekty takie często się przyjmują, zaś kolejne funkcjonalności sprawiają że na tej podwalinie powstają bardzo złożone systemy IT.
W rezultacie taka praktyka powoduje, że powstaje oprogramowanie bez przemyślanej architektury i z pilną potrzebą gruntownego refaktoringu lub przepisania. Należy jednak pamiętać że gdyby nie ten pierwszy skrypt (i prostota jego wykonania) taki system w ogóle mógłby nie powstać.
Liczne narzędzia wspomagające programowanie

PHP będąc jednym z najstarszych języków programowania, doczekał się licznych narzędzie ułatwiających pracę programistom.
Oprócz przeróżnych IDE znacząco usprawniającym programowanie (często pomagającym nawet uniknąć błędów) do dyspozycji mamy również:
- profilery i debugery kodu pomagające znaleźć błędy i wąskie gardła w kodzie (np. Xdebug , Blackfire),
- narzędzia do automatycznej dokumentacji, często przydatne w większych projektach dla których inni mogą tworzyć moduły lub pluginy (np. phpDocumentor, phpDox),
- narzędzia statycznej analizy, sprawdzające jakość kodu, pomagające utrzymać stałe konwencje programowania i zapewnić wyższa czytelność kodu (np. PHP_CodeSniffer, PHPStan).
Wady PHP
Większość wad przypisywanych PHP dotyczy przestarzałych wersji, jak PHP 5.4, lub wynika ze słabej jakości kodu napisanego przez początkujących programistów bez nadzoru doświadczonego architekta. Sam język bardzo często nie narzuca żadnych rozwiązań, zaś nowo wprowadzane funkcjonalności (jak np. deklarowanie typów) znacząco poprawiające jakość kodu są obligatoryjne i mogą nie być stosowane przez programistów. Do najczęstszych zarzutów PHP należą:
Mit o wolny w działaniu
Łatka ta została przypięta do języka PHP, kiedy w aplikacjach webowych dominowały głównie języki kompilowane (gdzie PHP jest językiem interpretowanym, czyli do działania wymaga dodatkowo maszyny wirtualnej), a używany wtedy silnik Zend Engine skupiał się na wstecznej kompatybilności (zachowując przestarzałe już konstrukcję z początkowej fazy rozwoju PHP).
Kompatybilność wsteczna została zerwana z wypuszczeniem wersji 7, zaś sam silnik skupił się na optymalizowaniu wydajności, która została jeszcze bardziej poprawiona w wersji 8. Zachęcamy do przeczytania wpisu na temat optymalizacji, gdzie na przykładzie pokazano, jak fragment kodu PHP został przetłumaczony do asemblera z pominięciem maszyny wirtualnej, uzyskując w ten sposób taką samą wydajność co analogiczny fragment kodu w C (który jest językiem kompilowanym).
W międzyczasie w świecie aplikacji internetowych popularność zyskały Node.js i Python, które również nie są kompilowane. W porównaniu z taką konkurencją, PHP 8, wraz ze swoimi usprawnieniami, jest bardzo mocnym graczem w wyścigu o najlepszą wydajność
Brak statycznego typowania
Już pierwsze wersje PHP oferowały dynamiczne typowanie zmiennych, jednak nowsze wersje sprawiają, że nie musimy całkowicie polegać na nieomylności programisty. Od wersji PHP 7 wprowadzono możliwość deklarowania typów, które są na bieżąco sprawdzane w kodzie i w razie konfliktu, czyli przypadku, gdy do zmiennej spróbujemy dopisać wartość o innym typie niż zadeklarowany, zgłoszą błąd.
Dodatkowo programiści mogą użyć licznych narzędzi do statycznej analizy kodu (często wbudowanych w IDE), które w momencie pisania kodu wykryją konflikt typów.
Od wersji PHP 7, mamy możliwość statycznego sprawdzania typów w kodzie bez jego wykonywania. Wymaga to używania odpowiednich narzędzi oraz, tak jak w językach stricte typowanych, deklarowania w każdym miejscu przez programistę odpowiednich typów.
Mit o problemach z bezpieczeństwem
PHP pozwala na dużą elastyczność podczas programowania, i w związku z tym udostępnia funkcje, które powinny być używane wyłącznie przez doświadczonych programistów, lub wręcz nie używane. Przykładem takiej funkcji jest eval(string $code) : mixed , która to jako parametr przyjmuje ciąg teksu, który ma zostać wykonany jako integralny kod z resztą programu. W samej dokumentacji jest ostrzeżenie o wysokim ryzyku niebezpieczeństwa.
Innym przykładem jest niepozorna funkcja rand() : int, która z założenia powinna zwracać losową całkowitą liczbę. Problem w tym, że funkcja ta jest niebezpieczna kryptograficznie, co oznacza, że już na niewielkiej próbie losowań zwraca powtarzające się, a więc nielosowe, wartości. Działanie funkcji jest dokładnie opisane w dokumentacji, a odpowiednio skonfigurowane IDE powinno ostrzec programistę przy próbie jej użycia). Od PHP 7, dostępna jest bezpieczne alternatywa: random_int.
PHP zawiera wiele niebezpiecznych elementów ze względu na zachowywanie kompatybilności wstecznej, jednak potencjalne zagrożenie można całkowicie wyeliminować, stosując się do ostrzeżeń w dokumentacji oraz zasad pisania czytelnego i bezpiecznego kodu.
Warto także wspomnieć że PHP słynie z długiego okresu dostarczania poprawek bezpieczeństwa dla starszych wersji.
Podsumowanie
PHP pozwala na tworzenie niebezpiecznych konstrukcji, a pozostawienie projektu mało doświadczonym programistom bez motywacji do praktykowania dobrych wzorców może spowodować wiele problemów.
We wszystkich prowadzonych przez nas projektach, oprócz programistów, bierze udział techniczny Team Leader, którego jednym z zadań jest nadzorowanie jakości kodu i pilnowanie bezpieczeństwa tworzonego oprogramowania.
Nasi klienci
Polski Związek Motorowy
Adamed
Polska Agencja Prasowa
Astor
IFX Payments
TEB Edukacja
Fundacja Moc Pomocy
Elemental Holding
French Touch
Polski Komitet Normalizacyjny
TU
Bergakademie Freiberg
Bank Nowy BFG
Narodowe Centrum Promieniowania Synchrotronowego SOLARIS
Astorino Kawasaki Robotics
DTK&W Zespół Ogłoszeniowy
Opegieka
Crazy shop
PartyBox
WUOZ w Krakowie
Uniwersytet Medyczny w Łodzi
Grupa Mo
Jeleniogórska Organizacja Turystyczna
eFitness
Instytut Badań Literackich PAN
Danhoss
Fundacja Sztuki, Przygody i Przyjemności ARTS
Opennet.pl
Centrum Medyczne Intermed
Centrum Rozwoju Edukacji Edicon
Winner Europe
Po amputacji
MamMoc.pl
EtnoStoria
Widzisz Wszystko
EMKA Project
NowaLed ILL
Eco Light LED
LoxiMide
Fundacja AVLab.pl
RCC Nova
Vector Controls
Virtual SMS
Parus Holdings
Biuro Partner
Optime.AI
M2M Team
Kolejnym etapem było stworzenie systemu, który pozwala wygodnie zarządzać treścią słownika oraz udostępnienie słownika do użytku publicznego.
Projekt był tworzony z wykorzystaniem PHP oraz JavaScript.
Jednym z zadań było zaktualizowanie wersji PHP i Javy, a także zidentyfikowanie problemów wydajnościowych. Dzięki naszym optymalizacjom kluczowy proces został przyspieszony o ponad 100 razy – wcześniej trwał ponad dobę, obecnie zajmuje kilkanaście minut.
Charakterystyka
PHP jako język interpretowany i skryptowy
PHP jest językiem interpretowanym, co oznacza, że jego kod jest przetwarzany podczas wykonywania, a nie kompilowany przed uruchomieniem (jak w C lub C++). Dzięki temu PHP można uruchomić z terminala, pisząc linijkę po linijce i analizować rezultat przed podaniem kolejnej linijki kodu. Własność ta umożliwia łatwe wykorzystanie go podczas tworzenia skryptów automatyzujących przeróżne czynności.
PHP jest wykonywany na maszynie wirtualnej
Silnik Zend Engine wykonuje kod PHP na swojej maszynie wirtualnej, co ułatwia przeportowanie go na różne systemy operacyjne czy platformy. PHP 8 dodatkowo wspiera optymalizację przez kompilację JIT (Just-In-Time), co znacząco zwiększa wydajność poprzez tłumaczenie wąskich gardeł bezpośrednio do kodu maszynowego z pominięciem wirtualnej maszyny.
Modułowość PHP
PHP wspiera dzielenie funkcjonalności w moduły. Sam w sobie zawiera ponad 20 podstawowych modułów, które są nieodłączną częścią PHP (i nie można ich wyłączyć) jak np. moduł Arrays do obsługi tablic. Dodatkowo umożliwia instalowanie i włączanie dodatkowych moduły rozszerzających podstawowe funkcjonalności. Do najpopularniejszych należą: SimpleXML, OpenSSL, IMAP, cURL, Zip, czy rozszerzenia PDO dla konkretnych baz danych: PDO_MYSQL, PDO_OCI (Oracle), PDO_PGSQL (PostgreSQL), PDO_SQLITE (SQLite).
Wieloparadygmatowość PHP
PHP to język imperatywny, ale wspiera również programowanie obiektowe (od wersji 4, w pełniejszym zakresie od PHP 7) oraz programowanie funkcyjne. W przypadku obiektowości mamy dostęp do wszystkich niezbędnych mechanizmów takich jak: dziedziczenire, ograniczanie widoczności, wirtualne klasy i interfejsy. W rezultacie programiści mają tutaj pełną dowolność w metodyce programowania którą chcą zastosować.
Prosta i elastyczna składnia
Składnia PHP jest zbliżona do C, a jej najbardziej charakterystycznym aspektem jest znak $ poprzedzający nazwę każdej zmiennej. Bloki kodu są objęte nawiasami { }, zaś białe znaki są ignorowane (nie jak np. w Pythonie). W PHP nie mamy mechanizmów pakietów i złożonych przestrzeni nazw, zaś standardowe nazewnictwo zachęca raczej do krótszych naz, bez potrzeby pisania zbędnych linijek tekstu.
Frameworki i systemy w PHP
Dedykowane aplikacje WWW - Frameworki w PHP






Systemy zarządzania treścią - CMS w PHP





Sklepy internetowe - Platformy e-commerce w PHP




To tylko część najpopularniejszych systemów OpenSource napisanych w PHP, gotowych do wykorzystania w nowych lub istniejących projektach. Niewirusowa licencja OpenSource i dostępność pełnego kodu źródłowego umożliwia doświadczonemu zespołowi programistycznego wprowadzenie dowolnej modyfikacji - od drobnych zmian w wyglądzie, czy kolorystyce, do implementacji nowych rozbudowanych procesów biznesowych i funkcjonalności.
Prócz powyższych systemów, dostępna jest również ogromna liczba rozwiązań mniej kompleksowych, ale rozwiązujących konkretne problemy. Np. system MediaWiki służy do tworzenia przeróżnych "Wiki", np. firmowej bazy danych, a najpopularniejsza jego implementacja to Wikipedia.org.
W ImpiCode oprócz tworzenia dedykowanych systemów całkowicie od zera zajmujemy się również doborem odpowiedniego narzędzia Open Source, który następnie dostosowujemy i wdrażamy zgodnie z Twoimi potrzebami.
Dostosowanie dostępnego rozwiązania OpenSource lub jego rozbudowa o dodatkowe funkcjonalności potrafi być o rząd wielkości tańsze niż tworzenie całości od zera. Jeśli chcesz dowiedzieć się więcej, możesz umówić się na spotkanie on-linie.
Historia PHP
Początek PHP - zbiór skryptów
Za początek PHP możemy przyjąć 1993 rok, kiedy Rasmus Lerdorf napisał kilka skryptów Common Gateway Interface (CGI) w języku C. Użył ich do rozszerzenia swojej osobistej strony internetowej o obsługę formularza i prezentowanie danych z bazy danych. Zbiór tych skryptów nazywał: „Personal Home Page/Forms Interpreter” lub PHP/FI.
Pierwsze składnie skryptów
<!--include /text/header.html-->
<!--getenv HTTP_USER_AGENT-->
<!--if substr $exec_result Mozilla-->
Hey, you are using Netscape!<p>
<!--endif-->
<!--sql database select * from table where user='$username'-->
<!--ifless $numentries 1-->
Sorry, that record does not exist<p>
<!--endif exit-->
Welcome <!--$user-->!<p>
You have <!--$index:0--> credits left in your account.<p>
<!--include /text/footer.html-->
Aby przyspieszyć rozwój i swoich skryptów w 8 czerwca 1995 r. na forum comp.infosystems.www.authoring.cgi.narkive.com ogłosił wydanie Personal Home Page Tools (PHP Tools) version 1.0. Wydany kod był zbliżony składnią do istniejącego języka Perl. Z samego założenia miał być to zbiór przydatnych funkcji do tworzenia stron, a nie niezależny język programowania. Wokół projektu zaczęła zbierać się już grupa programistów, którzy pracująć wspólnie w 1997 roku wydali kolejną wersję zestawu narzędzi: PHP/FI 2. Niestety rozwój PHP na tym etapie przebiegał bardzo chaotycznie i bez ogólnych założeń na temat np. nazewnictwa.
PHP 3 i 4 - pełnoprawny język programowania
Prawdziwy rozwój PHP jako języka programowania zaczął się od wersji 3 kiedy to Zeev Suraski i Andi Gutmans przepisali aktualny parser i stworzyli podstawę PHP 3, zmieniając nazwę języka na PHP Hypertext Preprocessor. Po zakończonych testach oficjalne wydanie miało miejsce w czerwcu 1998 roku. Zaraz po nim usiedli do przepisania rdzenia PHP, tworząc kompilator i środowisko programistyczne Zend Engine.
W maju 2000 roku wydano PHP4 działający już na silniku Zend Engine 1.0, który następnie był rozwijany w tej wersji aż do 2008 roku.
PHP 5 - podbił większość serwerów
W 2004 ukazała się pierwsza wersja PHP 5 wprowadzająca wiele ulepszeń do obiektowości oraz interfejs komunikacji z bazą danych: PHP Data Objects, w skrócie PDO, który do dziś używany jest w nowszych wersjach języka. W rezultacie wersja 5 zyskała ogromną popularność i znalazła się na większości wówczas dostępnych serwerów www. Jej następca, wersja PHP 6, mająca obsługiwać kodowanie unicode, ostatecznie nie wyszła, a zamiast tego wydano PHP 5.4 zawierające podobne rozszerzenia. Oficjalne wsparcie bezpieczeństwa dla PHP 5 (już 5.6) zakończyło się dopiero w 2018 roku.
PHP 7 - uwspółcześnienie i zerwanie kompatybilności wstecznej
[PHP 7] W roku 2014 rozpoczęto pracę nad poprawieniem wydajności samego PHP. W tym celu przeprowadzono refaktoring Zend Engine oraz zerwano ze wsteczną kompatybilnością, wycofując wiele przestarzałych elementów składni. W wyniku tych zmian wydajność PHP wzrosłą dwukrotnie podczas testów na WordPressie. Dodatkowo zerwanie wstecznej kompatybilności otworzyło furtkę do dalszego uspójniania składni i wprowadzenie nowoczesnych konstrukcji znajdujących się już w innych językach. W ten sposób PHP 7 został językiem ze współczesną składnią.
Przykładowy kod wspierany od wersji PHP 7 (możliwość typowania):
function getAdder(int $x): Closure {
return fn(int $y): int => $x + $y;
}
$adder = getAdder(8);
echo $adder(2); // wypisze "10"
echo $adder(null); // zgłosi wyjątek, błędny typ
PHP 8 - współczesne wersje
W 2020 wydana została wersja PHP 8.0. Wprowadza kolejne dodatki do składni znane z innych nowoczesnych języków programowania, a przede wszystkim wspiera kompilację just-in-time, która znacząco poprawia wydajność PHP w obliczeniach matematycznych, czyniąc z niego język zdatny również do implementowania złożonych algorytmów obliczeniowych.
Przykładowy kod obiektowy wykorzystujący konstrukcję z PHP 8:
abstract class User {
protected string $name;
public function __construct(string $name) {
$this->name = ucfirst(strtolower($name));
}
public function greet(): string {
return "Hello, my name is " . $this->name;
}
abstract public function job(): string;
}
class Student extends User {
public function __construct(string $name, private string $course) {
parent::__construct($name);
}
public function job(): string {
return "I learn " . $this->course;
}
}
class Teacher extends User {
public function __construct(string $name, private array $teachingCourses) {
parent::__construct($name);
}
public function job(): string {
return "I teach " . implode(", ", $this->teachingCourses);
}
}
$students = [
new Student("Alice", "Computer Science"),
new Student("Bob", "Computer Science"),
new Student("Charlie", "Business Studies"),
];
$teachers = [
new Teacher("Dan", ["Computer Science", "Information Security"]),
new Teacher("Erin", ["Computer Science", "3D Graphics Programming"]),
new Teacher("Frankie", ["Online Marketing", "Business Studies", "E-commerce"]),
];
foreach ([$students, $teachers] as $users) {
echo $users[0]::class . "s:\n";
array_walk($users, function (User $user) {
echo "{$user->greet()}, {$user->job()}\n";
});
}
Aktualnie 35% serwerów z PHP używa w wersji 8. Połowa (50%) rynku pozostaje przy PHP 7 (z czego 36% korzysta z najnowszej 7.4). Oprócz tego 15% serwerów pozostaje przy PHP 5.