Czy w PHP jest pisanych dużo greenfieldów, czy tylko legacy i strony na Wordpressie czy innych gotowych CMSach?
Moim zdaniem to drugie przewyższa, ale to tylko moja opinia. Ja raczej nie zacząłbym projektu w PHP.
Co może sprawiac, że ludzie sami z własnej woli zaczynając nowiutki projekt w 2022, stawiają go w PHP?
Moim zdaniem, w 99% przypadków to że znają tylko ten język.
Wielokrotnie rozmawiałem z "obrońcami języków". Jeśli znajdziesz kogoś kto pisze tylko w dajmy JS albo PHP, i wskażesz wady języka, to wielu ludzi bierze to personalnie do siebie: "co? przecież to jest mój język, nie możesz go krytykować". Ale opinie słałby wrazem z nauką innych języków.
Czy im się podoba ten język? (trochę szokujące, ale np. mnie się podoba JS, mimo, że też widzę jego wady i mnie wkurza często. Może tak jest z PHP?)
Jeśli znasz tylko jeden język, to ciężko sobie wyrobić zdanie na jego temat. Dla takich ludzi po prostu "jest jak jest". Jak zaczynasz pierwszy język, to nie wiesz czy coś z czego korzytasz jest cechą programowania w ogóle (jak np sortowanie, hashowanie, bezpieczeństwo, testowanie, solid, modularyzacja), czy jest tylko wymyśłem języka.
Noi też PHP ma to do siebie że bardzo łatwo jest postawić coś początkowego w nim. Jak masz statyczną stronę na Apache'u, to nie musisz robić totalnie nic. Po prostu zmień rozszerzenie z index.html
na index.php
i już możesz pisać. Co prawda łamie to wszelkie dobre zasady jakie istnieją (dependency inversion, MVC, separation of conerns, co sprawia że na dluższą metę taki projekt jest nierozwijalny), ale tak czy tak to jest kwestia sekund żeby to postawić; co może być wygodne dla nowicjuszy którzy nie znają alternatyw. Najczęstszym przykłądem tego jest jeden plik PHP, w którym jest osadzony zarówno PHP, HTML, JS czasem z jQuery, SQL i CSS wymieszane jak w szatkownicy, razem z sesją i ciastkami, bez żadnych testów ale za to z podatnością na SQL injection i XSS.
W większości języków zrobienie czegoś dobrego jest proste; i musisz się znać żeby zrobić coś głupiego. W PHP zrobienie czegoś głupiego jest proste, i musisz się bardzo znać, żeby to zrobić dobrze.
PHP ma jakby "wbudowaną integrację z HTTP". Żeby w Javie albo Pythonie wytawić API po HTTP musisz użyć Springa albo Django, czyli poniekąd musisz wiedzieć co robisz. W PHP dostajesz z automatu $_POST
, $_GET
, $_HEADERS
oraz $_SESSION
, mimo że nowicjusz nie ma pojęcia czym one są, ani w ogóle czym HTTP jest. Pomijając fakt że wtedy aplikacja automatyczine dostaje dodatkową zależność od integracji z interfejsem webowym, to to jest wrzucanie amatora na tak głęboką wodę jak tylko się da; ale Ci amatorzy są szczęśliwi bo jak przekazują parametr to muszą wpisać "tylko" $_GET['id']
i "działa". Ale to że takie zwalone rozwiązanie za tydzień dwa stanie się spaghetti, to już nie ich problem ;)
Dodatkowo, mogą też bezproblemowo pomieszać języki na dziesiątą stronę. PHP jest tutaj wyjątkiem, bo tylko tutaj da się w tak prosty sposób strzelić sobie w stopę i pół głowy, po prostu pisząc <script>
albo SELECT * FROM
, albo <style>
zaraz w środku index.php
i to "działa", dla amatora przynajmniej. Nawet jak jakiś co mądrzejszy amator spróbuje to podzielić na pliki script.js
, style.css
, file.sql
to dostaje szmatą w twarz, bo PHP w 99.999% przypadków stoi na apache'u, i modularyzacja plików nie jest ogarnięta od razu, więc jak amator spróbuje tak zrobić, to na 99% mu się to nie uda tak prosto; bo to wymaga wiedzy tego co się robi, np znajomości .htacess
albo tego jak działa ruch w sieci. I taki amator, nie zdając sobie sprawy z tego że złamał tysiąc antypatternów i dobrych praktyk, ma plik na 100 linijek, który postawił mu całą aplikacje. Noi też popularnym trickiem staje się taka konfiguracja Apache, która woła różne pliki zależnie od podstrony, np page.com/file.php
lub page.com/user.php
. Czyli zamiast mieć jeden entry-point, który obsługuje API, ta integracja jest porozsiewana po różnych plikach, ale PHP nie dostarcza żadnego sensownego systemu modularyzacji, więc to się kończy albo copy-pastem, albo require()
z jednego pliku do drugiego, ale też ponieważ mamy zwalone MVC w PHP, to część kodu dostarcza nowe funkcje, a część renderuje widok (bo są index.html
zamienionymi na index.php
), przez co potem powstają takie błędy jak np cannot modify header information, headers already sent
.
Noi jest też trzeci element, funkcje w PHP robią często "więcej niż jedną rzecz". Więc jak nowicujesz chce zrobić coś popularnego (np dodać email na stronę, albo osadzić HTML), to musi się stosunkowo mało napisać, bo funkcje w PHP robią więcej rzeczy za niego. Problem pojawia się kiedy chcesz zrobić coś "Swojego", kapkę bardziej customowego. Wtedy fakt że funkcje w PHP nie spełniają SRP, to zaczynają Ci bardziej przeszkadzać niż pomagać. Na profesjonalnym poziomie, takie przeszkadzanie przewyższa 1000x bardziej koszt utrzymania. Dla amatora, ktory musi użyć jednej funkcji zamiast trzech i "jakoś działa" to jest spoko.
To co PHP robi tak na prawdę, to daje Ci zatrudne jabłko i czeka aż je zjesz.