Springen naar inhoud

Tekst over PHP interpreteren


  • Log in om te kunnen reageren

#1

Exception

    Exception


  • >100 berichten
  • 113 berichten
  • Ervaren gebruiker

Geplaatst op 07 januari 2013 - 08:42

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
[/list]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?

Bijgevoegde miniaturen

  • slide-8-728.jpg

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 07 januari 2013 - 11:11

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.

#3

Exception

    Exception


  • >100 berichten
  • 113 berichten
  • Ervaren gebruiker

Geplaatst op 07 januari 2013 - 12:54

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.
$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:

Veranderd door Exception, 07 januari 2013 - 12:56


#4

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 07 januari 2013 - 13:13

'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:
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.

#5

Ger

    Ger


  • >5k berichten
  • 16444 berichten
  • Technicus

Geplaatst op 07 januari 2013 - 13:26

PHP heeft een full object model. Het ondersteunt object inheritance, maar het is meer dan dat alleen:
http://php.net/manua...nguage.oop5.php
"Knowledge speaks, but wisdom listens."
- Jimi Hendrix -

#6

Exception

    Exception


  • >100 berichten
  • 113 berichten
  • Ervaren gebruiker

Geplaatst op 07 januari 2013 - 13:52

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.

#7

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 07 januari 2013 - 14:30

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!

#8

Benm

    Benm


  • >5k berichten
  • 8804 berichten
  • VIP

Geplaatst op 07 januari 2013 - 15:06

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.

Veranderd door Benm, 07 januari 2013 - 15:07

Victory through technology

#9

Exception

    Exception


  • >100 berichten
  • 113 berichten
  • Ervaren gebruiker

Geplaatst op 07 januari 2013 - 15:21

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"?

Veranderd door Exception, 07 januari 2013 - 15:23


#10

Ger

    Ger


  • >5k berichten
  • 16444 berichten
  • Technicus

Geplaatst op 07 januari 2013 - 15:31

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/manua...comparisons.php

Veranderd door Ger, 07 januari 2013 - 15:32

"Knowledge speaks, but wisdom listens."
- Jimi Hendrix -

#11

Exception

    Exception


  • >100 berichten
  • 113 berichten
  • Ervaren gebruiker

Geplaatst op 07 januari 2013 - 15:33

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) ?

$x = 1;
$y = "1";
$z = '1';

Indien ik het door heb:
$x == $y || $x == $z; // true
$x === $y || $x === $z; // false

#12

Ger

    Ger


  • >5k berichten
  • 16444 berichten
  • Technicus

Geplaatst op 07 januari 2013 - 15:37

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

#13

Benm

    Benm


  • >5k berichten
  • 8804 berichten
  • VIP

Geplaatst op 07 januari 2013 - 18:27

Je bedoelt $foo === $bar betekent dat ze niet identiek zijn (bijv 1 en true) ?

$x = 1;
$y = "1";
$z = '1';

Indien ik het door heb:
$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

#14

Exception

    Exception


  • >100 berichten
  • 113 berichten
  • Ervaren gebruiker

Geplaatst op 09 januari 2013 - 10:58

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 ?

Veranderd door Exception, 09 januari 2013 - 10:58


#15

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 09 januari 2013 - 12:14

.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.





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures