Tekst over PHP interpreteren

Moderators: jkien, Xilvo

Gebruikersavatar
Berichten: 111

Tekst over PHP interpreteren

Hier is een citaat uit een presentatie over (analyse in) PHP. (link) Of zie bestand (een afbeelding) indien je niet op de link wilt klikken.
PHP
  • Scripting Language
    • Virtual Machine: Zend Engine
      • Written in C
  • Multi-paradigm
    • Imperative (procedural)
    • Object-oriented (inheritance)
    • Weak dynamic typing
Ik begrijp niet waarom VM: ZE onder Scripting Language staat en ook niet waarom de taal waarmee het gemaakt is onder VM komt te staan.

Waarom staat er inheritance tussen ( ) achter OO. Wil dit zeggen dat PHP OO is in één opzicht, nl inheritance?

En waarom staat er weak dynamic typing in plaats van gewoon weak typing?
Bijlagen
slide-8-728.jpg
slide-8-728.jpg (76.99 KiB) 879 keer bekeken

Gebruikersavatar
Berichten: 2.609

Re: Tekst over PHP interpreteren

PHP wordt doorgaans niet gecompileerd (omgezet naar machinecode). In plaats daarvan wordt de code geïnterpreteerd door een script engine (of VM) die machine instructies genereert.

weak/strong zegt hoe streng het type checking is. static/dynamic zegt wanneer het gebeurt.

Wat ze precies met die inheritance bedoelen weet ik niet. Ik heb zelf nog niet met PHP gewerkt, maar ik denk wel dat daar ondertussen erg veel OO features inzitten.

Gebruikersavatar
Berichten: 111

Re: Tekst over PHP interpreteren

VM = PHP processor module, dus? Ik dacht altijd VM is "iets" eigen aan JAVA.

En waarom staat er zend, dan? PHP, en zijn PHP processor module, is toch veel ouder dan zend (de framework, de ide en de implementatie)?

Weak.

Code: Selecteer alles


$var = 1;

output $var . " is waar!";

$var = 'is waar';

Je kan iets anders dan een getal in $var steken. Is dit dan niet de bedoeling van dynamisch - want wanneer het gebeurt is nog vager - ? :oops:

Gebruikersavatar
Berichten: 2.609

Re: Tekst over PHP interpreteren

'Virtuele Machine' is een heel concept. De Java Virtuele Machine is enkel het meest bekende voorbeeld. De Zend engine is gewoon de PHP interpreter die het meest gebruikt wordt.

statisch vs dynamisch betekent dat de types gecontroleerd worden op het moment van compilen of at runtime. Aangezien PHP niet gecompileerd wordt, kan het niet anders dan dynamisch zijn. Zie evt ook deze discussie.

strong vs weak gaat over het feit dat de taal toelaat wat jij in je voorbeeld zegt of er een foutmelding over geeft.

In een zwak getypeerde taal kan ik zeggen:

Code: Selecteer alles

int i = 1;

string s = "2";

return i+s;
Wat daaruit zal komen hangt van de taal af. Dat kan zijn een integer met waarde 3 of een string met waarde "12".

Een sterk getypeerde taal zal mij daar een foutmelding geven.

Gebruikersavatar
Berichten: 17.653

Re: Tekst over PHP interpreteren

PHP heeft een full object model. Het ondersteunt object inheritance, maar het is meer dan dat alleen:

http://php.net/manual/en/language.oop5.php
"Knowledge speaks, but wisdom listens."
- Jimi Hendrix -

Gebruikersavatar
Berichten: 111

Re: Tekst over PHP interpreteren

Er is zeker meer en toch moest ik er even stil bijstaan en waarom het daar tussen ( ) staat. Ik dacht eerst aan deze drie mogelijkheden: eerste feature van OO PHP, of de belangrijkste of de enigste die echt is (alle andere zijn slechts modellen die bedoeld zijn voor een syntaxis die op OO lijkt).

Er staat ook "written in C".

In tegenstelling tot de PHP, C is compiling en niet scripting.

Zo, zou Zend Engine een C programma moeten zijn, en uiteindelijk wordt PHP geïnterpreteerd en dan gecompileerd, of is dit onjuist?

Nog iets anders dat straf is: PHP5 is OO maar C (de moeder) zelf niet aangezien het procedureel is.

Gebruikersavatar
Berichten: 2.609

Re: Tekst over PHP interpreteren

Exception schreef: ma 07 jan 2013, 13:52
Er staat ook "written in C".

In tegenstelling tot de PHP, C is compiling en niet scripting.

Zo, zou Zend Engine een C programma moeten zijn, en uiteindelijk wordt PHP geïnterpreteerd en dan gecompileerd, of is dit onjuist?

Nog iets anders dat straf is: PHP5 is OO maar C (de moeder) zelf niet aangezien het procedureel is.
Die engine is een (gecompileerd) computerprogramma. Ze bedoelen dat die engine zelf in C geschreven is. (De keuze voor C heeft meestal met performantie te maken, maar het kon evengoed een andere taal zijn.)

De engine zal jouw php script lezen en interpreteren en zal dan trachten uit te voeren wat er in jouw script staat. Ik benadruk: je script wordt geïnterpreteerd. Er wordt geen machinecode versie van je script gegenereerd.

Het is niet omdat C zelf geen OO ondersteunt dat je in C geen compiler kan schrijven voor een OO taal. Je kan trouwens ook een C compiler schrijven in C ;) Compilers zijn enorm ingewikkeld!

Berichten: 12.262

Re: Tekst over PHP interpreteren

PHP ondersteunt object oriented programmeren (classes etc), maar vereist het absoluut niet. Je kunt in php compleet procedureel programmeren als je dat wilt. Bovendien is het in de praktijk een taal die ook voor een heel eenvoudige scripting wordt gebruikt, waarbij in de regel geen OO aanpak gehanteerd wordt.

Typecasting in php is over het algemeen impliciet, de runtime compiler maakt ervan wat nodig is, en is in de regel vrij handig met 'snappen wat je wilt'. Je kunt bijvoorbeeld:

$a = 10; // automatisch gecast als numeriek

$b = "2"; // automatisch gecast as string

en dan pakweg

$c = ($a * $b); // "20", numeriek

of

$d = $a . $b; // "102" string.

doen.

Overigens heb je wel de mogelijkheid om specifiek te vergelijken of het ook om hetzelfde type gaat. Bijvoorbeeld:

$x = true; // boolean

$y = 1; // numerical

Er geldt dan dat $x == $y is true, maar $x === $y is false. Er is ook een !== die hetzelfde doet maar dan andersom.

Dit is wel belangrijk als je niet geweld bent aan losse typecasting. Vervelend kan bijvoorbeeld zijn als een functie numeriek 0 terug geeft en je daarmee wilt gaan vergelijken. Bij de == operator is 0 gelijk aan false, terwijl de functie bijv false teruggeeft als er iets niet klopt, en numeriek 0 als het antwoord gewoon 0 is.

Numeriek is in deze voorbeeld een of andere integer, geloof niet dat iemand zich in php ooit druk maakt over ints, tinyints of bigints. Het float type is wel anders uiteraard.
Victory through technology

Gebruikersavatar
Berichten: 111

Re: Tekst over PHP interpreteren

Leerrijk! bedankt allemaal. ;)

Waarom is $x === $y false en $x == $y true? Ik heb het verschil tussen == en === gelezen en (semantisch)begrepen maar in de praktijk snap ik er niets van in de zin dat ik niet onmiddellijk weet wanneer of in welk geval een === onmisbaar wordt. Is het soms gelijkaardig met Java-achtige .equals() "ding"?

Gebruikersavatar
Berichten: 17.653

Re: Tekst over PHP interpreteren

http://php.net/manua....comparison.php

Kort gezegd:

$foo == $bar betekent dat ze gelijkwaardig zijn (bijv 1 en true)

$foo === $bar betekent dat ze identiek zijn (bijv 1 en 1)

Het ligt er dus net aan wat je in je code wil bereiken: een controle op gelijkwaardigheid of een controle op identiek zijn.

Voorbeeldje wanneer === nodig is: http://php.net/manua...tion.strpos.php

Als die 0 retourneert, dan is dat iets anders dan FALSE, zoals de warning daar ook aangeeft.

Edit: een aantal handige tabellen die inzicht geven:

http://php.net/manual/en/types.comparisons.php
"Knowledge speaks, but wisdom listens."
- Jimi Hendrix -

Gebruikersavatar
Berichten: 111

Re: Tekst over PHP interpreteren

Ger schreef: ma 07 jan 2013, 15:28
http://php.net/manua....comparison.php

Kort gezegd:

$foo == $bar betekent dat ze gelijkwaardig zijn (bijv 1 en true)

$foo === $bar betekent dat ze identiek zijn (bijv 1 en 1)

Het ligt er dus net aan wat je in je code wil bereiken: een controle op gelijkwaardigheid of een controle op identiek zijn.
Je bedoelt $foo === $bar betekent dat ze niet identiek zijn (bijv 1 en true) ?

Code: Selecteer alles


$x = 1;

$y = "1";

$z = '1';

Indien ik het door heb:

Code: Selecteer alles


$x == $y || $x == $z; // true

$x === $y || $x === $z; // false


Gebruikersavatar
Berichten: 17.653

Re: Tekst over PHP interpreteren

Jep. Zie ook mijn edit.
"Knowledge speaks, but wisdom listens."
- Jimi Hendrix -

Berichten: 12.262

Re: Tekst over PHP interpreteren

Exception schreef: ma 07 jan 2013, 15:33
Je bedoelt $foo === $bar betekent dat ze niet identiek zijn (bijv 1 en true) ?

Code: Selecteer alles


$x = 1;

$y = "1";

$z = '1';

Indien ik het door heb:

Code: Selecteer alles


$x == $y || $x == $z; // true

$x === $y || $x === $z; // false

Je zou hier voor $z ook nog

$z = true;

kunnen gebruiken - er is geen verschil tussen '1' en "1". Er is echter wel verschil tussen enkele en dubbele haakjes:

$a = 'bier';

echo "Ik lust graag $a"; // doet wat je (meestal) wilt

echo 'Ik lust graag $a'; // als je liever $a drinkt dan bier ;)
Victory through technology

Gebruikersavatar
Berichten: 111

Re: Tekst over PHP interpreteren

Wie weet bestaat er een bier met de naam $a. :P

Nog iets over het verschil tussen de talen, volgens die presentatie zijn er drie soorten:

- Compiling Languages: C wordt vertaald naar machine code.

- Compiling Languages: Java of VB.NET wordt vertaald in byte code (een "tussen stapje").

- Scripting Languages: PHP wordt geïnterpreteerd.

Nu, ik begrijp waarom Java met een tussen stap werkt omdat het platform onafhankelijk moet zijn, maar waarom werkt .NET ook op deze manier dan? Ik dacht aan één reden: om het leven van programmeurs die samenwerken makkelijker te maken: de ene doet liever vb en de andere kiest c#. Toch onzin omdat het mogelijk is om twee aparte talen te combineren. Facebook makers deden het in c++ en php ?

Gebruikersavatar
Berichten: 2.609

Re: Tekst over PHP interpreteren

.NET werkt ook op een virtuele machine (CLR). Het doel is inderdaad 'language interoperability'. Dat houdt in dat applicaties geschreven in eender welke .NET taal op een natuurlijke manier kunnen samenwerken omdat ze uiteindelijk naar dezelfde bytecode worden gecompileerd. Bibliotheken in .NET kunnen in elke .NET taal hergebruikt worden.

Als je niet in het .NET framework werkt en je bekijkt bijvoorbeeld de klassieke VB en C++, dan kan je die vaak alsnog laten samenwerken, maar dan moet je dingen als wrappers gaan schrijven. Het is dus niet onmogelijk, maar het kost wel extra tijd en moeite.

Reageer