... mij uit te leggen hoe PHP onder de motorkap werkt?
Ik kan me nog herinneren dat in mijn Commodore 64 tijd je kon programmeren in de taal 'Basic'. En dat zag er dan zoiets uit:
jeugdsentiment
Ik kan me ook nog herinneren dat ik als klein manneke een keer een boek had gekocht waarmee je een programma kon maken voor de Commodore 64, en met dat programma kon je "makkelijk" sprites maken.
Wat een sprite is?
Niet dit:
Maar bijvoorbeeld deze luchtballon... een simpel plaatje bestaande uit "blokjes". Dat kon je dan over je beeldscherm laten vliegen... WOEEHOOEE... VET!!! ...ja, ehmm oké... ehhh, computers waren in die tijd nog niet zo high-tech als nu hè ;-)
Ik kan me nog goed herinneren dat ik toch wel zo'n 20 bladzijdes met machinetaal heb overgetypt (hoe gek kun je zijn) en uiteindelijk werkte het programma worden boven wonder nog prima ook! (Wat zou er gebeurd zijn als ik 1 tekentje verkeerd had getypt...) Die machinetaal sprak rechtstreeks de processor aan en zag er ongeveer zo uit:
Met pookes en peeks heb ik uiteindelijk vroeger in combinatie met de Atari Home XL en de tape-recoder een programma geschreven (lees: 80% aan code uit een boekje overgetypt) om cassettebandjes af te kunnen spelen via je TV.
Vond ik best wel tof toen :-P
Volgens mij is PHP gebouwd op C# of C++. Ben zelf niet zo bekend met deze programmeertalen, maar je kan de source van PHP eens downloaden.
Even een simpel en leuk voorbeeldje:
PHP heeft als basis de Zend Engine. Dit is de grote parser (die staat in de map zend). Daarboven op heb je heel veel PHP extensies (die staan in ext). Dit zijn de meeste PHP functies. Deze functies zijn geregistreerd door PHP_FUNCTION <functienaam>.
Laten we explode opzoeken. We typen daarvoor in de zoekbar "PHP_FUNCTION strlen" in (met quotes). We krijgen dan 2 bestanden: php_string.h en string.c. In een .h (header) file staat beschreven welke functies die in .c staan gebruikt mogen worden door de buitenwereld. Niet erg interessant, we willen de functie weten dus klikken we op de line in string.c. We krijgen dan een hele lange code te zien.
Eerst zien we een hele reeks variabele definities. Leuk om te weten, maar meer niet. Vervolgens komt er dit:
Hier worden de parameters die jij aan de functie geeft geparsed. Dat begin slaan we over, en dan zien we "ss|l". Dit betekend dat explode 2 parameters verwacht die beide string zijn. Vervolgens komen er de optionele parameters (aangegeven met de |) en dat is er 1 van het type long (getal). Daarachter zien we welke variabele in onze functie de waarde van de parameter krijgen. In ons geval delim + de lengte van delim, str + de lengte van str en limit.
Vervolgens zien we == FAILURE. FAILURE is een marco. C is een taal die eerst wordt gecompiled en vervolgens uitgevoerd kan worden. Met marco's kun je aan de compiler aangeven dat bepaalde keywords een andere waarde krijgen. Deze keywords herken je aan hun hoofdletters. Als we erop klikken zien we de waarde van deze marco:
#define FAILURE -1
Er komt dus na het compilen == -1 te staan.
Goed, we gaan weer verder met onze functie. Als er iets fout is zal de functie stoppen met uitvoeren en zal de Zend Engine een fatal error geven.
Hier kijken we of de delimeter een lengte heeft, zoniet dan zal PHP een E_WARNING error geven met de message 'Empty delimiter' (waarbij E_WARNING weer een marco is voor 1<<1L).
Daarna zal er false geretourneerd worden. (RETURN_FALSE is ook weer een macro)
Vervolgens wordt er nog zo'n check gedaan en daarna wordt php_explode of php_explode_negative_limit aangeroepen. Dit is een pattern dat vaak in PHP wordt gebruikt; de logica van een functie wordt gescheiden van de error handling. Dit zorgt ervoor dat de logica functie's zeer herbruikbaar zijn.
Dit was even een hele snelle introductie (hoe het precies werkt kun je uitvinden door php_explode uit te pluizen). Voor meer informatie verwijs ik graag naar de tutorialreeks die ik aan het begin van deze post plaatste.
Maar daarom ging het ooit ook. Rasmus Lerdorf heeft PHP bedacht als voor mensen begrijpelijke scripttaal omdat hij niet eindeloos hetzelfde wilde doen in een programmeertaal.
@Wouter: thanks voor je uitleg! Zal binnenkort even de tutorial doorlezen. Je hebt het telkens over marco, maar ik neem aan dat je macro bedoelt?
Maar we hebben dus een onderliggende taal C die als het ware PHP "interpreteert". Dus PHP wordt omgezet in C. En wat gebeurt er dan? Wordt C omgezet in machinetaal en gaat het dan rechtstreeks naar de processor van de server?
P.S. Hoe weet jij dit allemaal? Heb je je jezelf er helemaal in verdiept?