PHP sucks, of toch niet?

Door AtleX op woensdag 21 mei 2008 19:17 - Reacties (22)
Categorie: PHP, Views: 11.402

Ik ben een trouw lezer van Jeff Atwood's Coding Horror. Zijn posts zijn lang en informatief, en bevatten vaak interessante invalshoeken. Zoals het item van vandaag, PHP Sucks, But It Doesn't Matter.

Veel programmeurs doen nogal laatdunkend over PHP. Het zou maar een hobbytaaltje zijn, met een nogal inconsistente functie-naamgeving, geen namespaces, backwards compatiblity is gebrekkig, support voor character sets mist en de meeste code is spaghetti. Deze argumenten zijn natuurlijk voor een deel waar. Door de geschiedenis van PHP heen zijn er een aantal beslissingen genomen door het ontwikkelteam van PHP die nogal ongelukkig zijn uitgevallen.

Wat mij betreft zijn er 3 grote design failures, en met mij zijn veel mensen het erover eens. De eerste, Maqic Quotes, welke idioot heeft dat ooit verzonnen. Voor de onwetenden, het komt er op neer dat soms je single en double quotes escaped worden, maar soms ook niet. Het ligt eraan waar de data vandaan komt, en dan ook nog eens wat de waarde is van magic_quotes_gpc en magic_quotes_runtime. Deze instelling is centraal geregeld in de php.ini config file, en via get_magic_quotes_gpc() kan er gecontroleerd worden of magic_quotes_gpc enabled is. Maarrrrr, magic_quotes_sybase override magic_quotes_gpc, dus in dat geval heb je kans dat je double quotes en backslashes niet escaped zijn, en je single quotes ineens door 2 single quotes vervangen zijn. Als je dan door middel van stripslashes() de escaping slashes wilt verwijderen heb je kans dat je juist slashes verwijdert die moeten blijven staan. Ergo, een compleet drama dus.

Verder naar Safe Mode. Basically, in plaats van een beetje veiligheid vanaf het begin in te bouwen is er later iets ingehackt dat de veiligheid moet verbeteren. Begrijp me goed, ik ben een groot fan van Safe Mode en iedere applicatie die er niet mee werkt moet wat mij betreft terug naar de tekentafel. Het probleem met Safe Mode is dan ook niet dat het er is, maar dat het er ooit niet is geweest. Erger nog, nog steeds kan het uitgeschakeld worden. Veel legacy meuk werkt er simpelweg niet mee, en doordat het uit te schakelen is is er ook geen druk om de applicatie om te bouwen. Daardoor worden hosting companies min of meer gedwongen worden om Safe Mode uit te zetten.

Het laatste punt, Register Globals, is ook al zo'n miskleun. Het komt er op neer dat er geen onderscheid is tussen variabelen afkomstig van GET of POST of interne variabelen, en variabelen afkomstig van verschillende bronnen kunnen elkaar overschrijven. Een textfield op een formulier met de naam "name" is dan binnen PHP beschikbaar als $name. Of het volgende voorbeeld, afkomstig van PHP.net:

PHP:
1
2
3
4
5
6
7
8
9
<?php
if (authenticated_user()) {
    $authorized = true;
}

if ($authorized) {
    include "/highly/sensitive/data.php";
}
?>


Een url als "index.php?authorized=true" geeft nu toegang tot alle gegevens. Dat is een beveiligingslek vergelijkbaar met de kluis van Fort Knox open laten staan en de bewakers naar huis sturen.

Daarnaast heeft PHP ook nog andere negatieve punten. Met de eerder genoemde inconsistente naamgeving van functies ben ik het helemaal eens. Ik vergis me nog geregeld in de naam van een bepaalde functie, en zeg nou zelf, als je de lijst op Coding Horror bekijkt is het ook gewoon een zooitje.

Verder heeft het gebrek aan namespaces tot het geven van pseudo-namespace namen aan functies, wat de duidelijk niet bepaald ten goede komt. Gelukkig krijgt PHP namespace support in PHP 5.3, en daar hoeven we niet lang meer op te wachten.

Fatsoenlijke unicode support, waar Joel Spolsky over klaagde, zit er ook aan te komen, volgens Andrei Zmievski. Dat lost meteen veel problemen op, met bijvoorbeeld data uit een database die een 'verkeerde' character encoding heeft.

De rest van de meest voorkomende klachten vind ik nogal overdreven. Zoals de klacht van Tim Bray dat de meeste code spaghetti is. In principe geef ik hem gelijk, een rondgang over waarschijnlijk de grootste Nederlandse PHP communityp laat zien dat de meeste scripts meuk zijn. Maar is dat het probleem van PHP? Als ik kijk naar hoeveel Javascript tutorials nog document.write gebruiken lijkt me dat niet.

Daarom de stelling van vandaag: Nette code is de verantwoordelijk van de schrijver ervan. In elke taal kan een developer zich opknopen. Niemand houd mij tegen om in C# in het click event van een button alle logica uit te voeren, en Java doet echt niet moeilijk als ik tig-duizend keer een String object aan een andere String append in plaats van een StringBuilder te gebruiken.

Programmeren is een vak, iets dat je niet zomaar leert. Een taal leer je wel vrij eenvoudig, zeker iets laagdrempeligs als PHP of Javascript. En dat verklaart de bedenkelijke kwaliteit van de vele boeken, sites en scripts die er over met name deze 2 talen zijn volgeschreven. Iedere idioot kan het. Is het dan fair om de taal de schuld te geven van de meuk die 'programmeurs' schrijven? Imho niet. De taal is een tool, niets meer en niets minder. Als die tool niet de functionaliteit bied die je wenst, zoek er dan eentje die wel voldoet of leer leven met de beperkingen.

Volgende: Vrijdagavond verveling: Rendering snelheid van browsers 06-'08 Vrijdagavond verveling: Rendering snelheid van browsers
Volgende: MySQL Server Monitor (2) 05-'08 MySQL Server Monitor (2)

Reacties


Door Tweakers user simon, woensdag 21 mei 2008 19:48

register globals is eigenlijk al sinds php4.2 ofzo totaal geen issue meer, en ook voor je quotes issue komt een oplossing, dat is in PHP 6 al wel helemaal verwerkt, totdietijd is dat inderdaad nog kut met peren..

Door Tweakers user Boudewijn, woensdag 21 mei 2008 19:53

Je hebt wel een zeker punt, maar ook het zwakke typerings-systeem is een reden waarom veel code zo slecht gemaakt is denk ik.

En dat is dan wel weer een taaleigenschap ;).

Door Tweakers user maxi-pilot, woensdag 21 mei 2008 20:01

Ik moet je 100% gelijk geven, maar mits een goede toepassing van PHP kan je toch goede code produceren. Op het internet leer je de basis, maar om goede code te leren schrijven neem ik toch een boek in de hand.

Door Tweakers user Borizz, woensdag 21 mei 2008 20:14

Ik ben het helemaal met je eens wat betreft de 3 grote design failures, gelukkig worden juist deze 3 punten ook opgelost (verwijderd) in PHP6.

Behalve dan dat ik vind dat Safe Mode nooit thuis heeft gehoord in PHP. De beveiliging zou gewoon op OS/Webserver niveau geregeld moeten worden. Het is toch te gek voor woorden dat je in de programmeertaal de beveiliging van je systeem gaat afvangen. Dat lijkt me een beetje de omgekeerde wereld. Als 'alternatief' voor Safe Mode kan PHP ook draaien onder (fast)cgi (wat overigens ook prima werkt).

Door Tweakers user Cyphax, woensdag 21 mei 2008 22:11

PHP6 lost inderdaad veel van die punten op, maar ik ben wel van mening, en dat zal voorlopig wel zo blijven, dat het een bende is op sommige punten. En dan met name zaken als de naamgevingen enzo. Vergelijk het maar eens met Java of .Net, dan steekt het op dat gebied nogal schraal af.

Evenwel hangt het voornamelijk af van de programmeur zelf. Je kunt met PHP hele nette code schrijven, of je kunt er een pokkebende van maken. Geldt voor Perl, voor C, voor C# en voor de meeste talen wel.

Door Tweakers user GrooV, woensdag 21 mei 2008 23:13

PHP kan ook nooit op tegen de integratie van ASP.NET in visual studio, gewoon debuggen in je IDE, en dan ook nog de beste IDE die er is.

Door Tweakers user AndriesLouw, donderdag 22 mei 2008 00:02

Debuggen in de IDE? Dat kan mijn phpDesigner 2008 anders ook prima, wat in mijn ogen de beste IDE is ;)

Door Mathieu Kooiman, donderdag 22 mei 2008 07:38

@GrooV: er is ook Zend Studio beschikbaar, geimplementeerd binnen Eclipse, die zowel debugging als profiling aanbiedt. Dat heeft Visual Studio - de laatste keer dat ik er mee werkte (VS2003) - dan weer niet in 1 product ;).

@Atlex: leuke posting.Je 3 ergenissen zullen opgelost worden in PHP6. Zowel Safe mode, register_globals als magic_quotes zullen volledig verdwijnen in PHP6 (zie ook http://www.scriptorama.nl...patible-code-te-schrijven)

Wat betreft unicode in PHP6, daar gebruik je ietwat een understatement. PHP6 zal volledige unicode ondersteuning hebben - van boven naar beneden en van links naar rechts - tot het punt dat je japanse klasse namen kunt gaan gebruiken.

Door Tweakers user Brupje, donderdag 22 mei 2008 08:00

safe mode gaat er per 6.0.0 toch weer uit?

op dat punt ben ik het niet zo met je eens, safe mode is een brakke oplossing voor het probleem dat iemand niet kan programmeren.

Door Tweakers user MueR, donderdag 22 mei 2008 08:55

@Mathieu Kooiman:
Zend Studio for Eclipse is het grootste misbaksel wat er uit de doos van Zend is gekomen. Zend Studio Professional (5.5) was en is nog steeds mijn IDE of choice. Deze biedt hetzelfde, maar dan zonder de overbodige meuk die is achtergebleven als gevolg van het baseren op die achterlijke Eclipse pakketten.

Door Mathieu Kooiman, donderdag 22 mei 2008 10:29

@MueR: ik gebruik zelf dan ook TextMate + Xdebug, maar het kán het wel :P

Door Tweakers user GrooV, donderdag 22 mei 2008 11:58

@Mathieu Kooiman, Dit zit er in sinds VS2008 :)

Door Tweakers user jjkewl, donderdag 22 mei 2008 13:28

Goed artikel, strookt ook met mijn ervaring. Zelf heb ik enkele .Net projecten gered door ze te porten naar PHP omdat de betreffende teams niet bijster goede programmeurs waren. Dus dan heb ik liever dat ze een schroevendraaier in hun hand hebben dan een lasapparaat want daar leren ze meer van, kunnen minder stuk maken en genereren uiteindelijk betere code ("Sorry nee je hebt geen wizards in PHP").

De laagdrempeligheid van welke taal dan ook, levert verhoudingsgewijs meer bagger op. De open source gemeenschap is inmiddels zeer degelijk, maar de scripting gemeenschap moet nog volwassen worden.

Door Tweakers user IJsbeer, donderdag 22 mei 2008 14:16

Wat hierbij natuurlijk ook meespeelt is dat PHP enorm veel voordelen heeft voor de beginners/hobbiesten: Simpel te leren, grote community, veel open source te vinden en hosten is zowat gratis.

Met .NET en java ligt de lat om te hobbieen al wat hoger, en dus blijven de hobbiesten er sneller vanaf.

Door Tweakers user BlackIce, donderdag 22 mei 2008 14:17

Ik ben het met je eens, PHP is geen perfecte taal en in sommige opzichten te makkelijk.
Hij is wel redelijk breed, je kunt er een hoop mee en als het niet kan is het vaak zelf te bouwen.
Verder ben ik een vrij typische PHP-ontwikkelaar, van klunzige, onveilige scripts schrijven heb ik veel geleerd en inmiddels heb ik een goed idee van wat PHP ergens mee doet.
Als je er goed mee kan werken en een beetje serieus kan programmeren kan je er wel degelijk elegante dingen mee maken op een veilige manier, het punt is alleen dat je het met php veel makkelijker verkeerd kan doen (athans, zo zie ik het).
Toch is het een heerlijke taal zonder al te veel poespas.

Door Tweakers user Floort, donderdag 22 mei 2008 14:27

Een van de dingen waaraan ik me het meeste erger in PHP is de manier waarom ze "gebruikersvriendelijk" willen zijn en bijvoorbeeld fouten in de code proberen te corrigeren.

Voorbeeld:
<?php
define("VAR", "waarde");
echo VAAR;
?>
Dit is overduidelijk een bug, maar PHP print vrolijk de string "VAAR" uit, produceert een "PHP Notice" en gaat vrolijk door alsof er niks aan de hand is. Ik wil dat mijn programma in zo'n geval keihard crashed, dan weet ik in ieder geval meteen dat er iets fout is in plaats van dat ik vrolijk doorwerk met foute data.

Door Tweakers user pasz, donderdag 22 mei 2008 17:30

Geef je wel gelijk, alleen is het zo'n lekker simpel taaltje om snel wat in elkaar te hacken. Geldt eigenlijk ook voor bijvoorbeeld python.

Maar zelfs met ASP.NET kun je flinke meuk software bouwen. Check bijvoorbeeld maar eens wat je allemaal in je aspx pagina kan frotten in plaats van het netjes in je code-behind file te zetten.

Door Tweakers user Punkie, donderdag 22 mei 2008 18:00

Mooie tekst. Als niet PHP-er is het wel even lachen over zulke flaters. Maar ja, PHP heeft me altijd de indruk gegeven vooral snel een oplossing te willen bieden op korte termijn ipv de beste op lange termijn te willen zijn. Geen van beide is de heilige graal echter.

@GrooV
Debugging doe je met een debugger, niet met een IDE. De integratie van een debug GUI in een IDE staat dan weer los van de debugger en al helemaal van de taal. M.a.w. je vergelijking van GUIs voor debuggers in IDE's heeft NULL uitstaans met de talen waarvoor de betreffende debugger geschreven is.

Door Tweakers user ZpAz, vrijdag 23 mei 2008 19:59

Het ligt hem voor een groter gedeelte aan de programmeur vind ik toch, in elke taal kan je 'suckende code' schrijven. Zo kan je ook in php niet suckende code schrijven.

Mischien is de OOP wel niet zo complex als in de diverse andere talen, hoewel dit met 5 verbeterd is, en met 6 denk ik ook wel verbeterd is/wordt.

Door Tweakers user Alex), zaterdag 24 mei 2008 02:24

Ik heb een haat/liefde-verhouding met PHP. Lekker taaltje om snel mee te programmeren, maar je kunt er ook enorme bagger mee maken. En ik ben het roerend eens met alle aangestipte dingen.

Leuk voorbeeldje trouwens: www.php.net/base_convert, die is flawed. Zie de comments, zoek eens naar 'unfucked_base_convert', dan snap je wat ik bedoel :)

Door Tweakers user HawVer, dinsdag 27 mei 2008 11:54

In meerdere comments lees ik dat je .net als voorbeeld moet nemen. Dat geldt absoluut niet voor ASP.net. Ik heb inmiddels al teveel workarounds geschreven voor mijn webapplicaties. Imho is ASP .NET absoluut niet bruikbaar voor enterprise oplossingen. Bijvoorbeeld inline code (in de template) syntactisch 100% correct, maar draait niet, vanwege single quote problemen.
Daarnaast ben je je constant aan het aanpassen aan de denkwijze van de microsoft ontwikkelaars. PHP biedt je veel mogelijkheden tot het volledig opzetten en uitdenken van een framework, terwijl ASP.NET je al een framework biedt waar je maar omheen moet werken.
Nette code is de verantwoordelijk van de schrijver ervan.
Discussie lijkt mij onnodig. :P

Door Tweakers user Ramon, donderdag 26 juni 2008 00:47

Je kan in ASP.NET ook perfect zonder het "framework" werken hoor, gewoon met <% %> tags. Dus als je de Microsoft manier compleet onhandig vindt (ik loop ook wel eens tegen irritaties aan met asp.net) dan kan je gewoon op de 'php'-manier met asp.net werken.

Je zou ook eens asp.net mvc kunnen proberen, zit ook leuk spul bij.

Reageren is niet meer mogelijk