[PHP] parsings gedrag klasses

Pagina: 1
Acties:

  • vinnux
  • Registratie: Maart 2001
  • Niet online
Nu ik alle enig etijd bezig ben met klasses in PHP valt mij op dat klasses alleen maar volledig worden geparsed en gecheckt wanneer dat nodig is.

Wanneer ik dus een class include maar ik gebruik hem niet dan wordt ie alleen maar op syntax gecontroleerd. Klein voorbeeldje.
PHP:
1
2
3
4
5
6
7
8
<?class A{
  function A(){ 
  }  

  function b(){  
    return getIets(); 
  }
}?>

Nou je ziet dat in functie b een aanroep word gedaan naar een niet bestaande functie getIets(). Je zou verwachten dat als je deze code in een bestand zet en vervolgend die code oproept, dat ie dan een foutmelding geeft. Helaas niet. Dit vind ie gewoon goed !
Waneer je echter de volgede code toevoegd :
PHP:
1
2
<?$a = new A();
$a -> b()?>

Dam krijg je pas de foutmelding.
Heb hetzelde gedrag geconstateerd bij if constucties, etc.

Dat PHP dat doet is natuurlijk een goede zaak, parsen en checken wat niet nodig is is natuurlijk onzin.
Doch kan dit heel erg irritant zijn bij het maken van klasses, aangezien je anders allemaal testcases moet maken die alles afvangt.

En hier de vraag :
Kun je er binnen PHP voor zorgen dat alle code geparsed en gecheckt wordt ?

  • Orphix
  • Registratie: Februari 2000
  • Niet online
En wat maakt jou zo almachtig dat jij direct alle functies in 1x goed hebt :? :P

Oftewel ... don't bother, test them all

  • vinnux
  • Registratie: Maart 2001
  • Niet online
Op dinsdag 16 april 2002 22:57 schreef Orphix het volgende:
En wat maakt jou zo almachtig dat jij direct alle functies in 1x goed hebt :? :P
Oftewel ... don't bother, test them all
Please stick to the question !

Verwijderd

vgouw: Wanneer ik dus een class include maar ik gebruik hem niet dan wordt ie alleen maar op syntax gecontroleerd.
Een include of require zorgt er alleen voor dat het bestand dat de include of required wordt geparsed wordt. Checken op bestaande functies etc heeft geen zin, omdat die functies weer in een andere bestand kunnen zitten dat nog geinclude of required moet worden, runtime gedefinieerd moeten worden, etc.
Kun je er binnen PHP voor zorgen dat alle code geparsed en gecheckt wordt?
Parsen wel, maar daar was je al achter. "Checken" niet.

  • vinnux
  • Registratie: Maart 2001
  • Niet online
Toch nog steeds benieuwd naar een manier om een check te forceren.

  • vinnux
  • Registratie: Maart 2001
  • Niet online
Ja de laatste keer hoor :)

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 29-08 19:47

Bosmonster

*zucht*

Maak van iedere klasse even een dummy-instantie? :P

Al ontgaat mij het nut compleet... Klasses die je schrijft moeten toch kloppen.. anders kom je er toch wel achter als je ze daadwerkelijk gebruikt.. Het voordeel dat ze niet geinterpreteerd worden totdat ze geinstantieerd worden is een voordeel wat je teniet wil doen...

afdeling nutteloze topics :P

  • vinnux
  • Registratie: Maart 2001
  • Niet online
Je mening hoefde ik niet te horen. Sorry dat je niet inziet dat ik deze vraag graag beantwoord ziet ik heb met je te doen .................

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 29-08 19:47

Bosmonster

*zucht*

vgouw schreef op 26 oktober 2002 @ 23:33:
Je mening hoefde ik niet te horen. Sorry dat je niet inziet dat ik deze vraag graag beantwoord ziet ik heb met je te doen .................


Sorry dat je niet inziet dat een antwoord er niet toe doet als het doel nutteloos is ;)

Maar goed.. een antwoord (sterker nog, de enige mogelijkheid) heb ik je net gegeven. Een dummy instantie maken van je classes.

  • vinnux
  • Registratie: Maart 2001
  • Niet online
Bosmonster schreef op 26 oktober 2002 @ 23:40:

[...]


Sorry dat je niet inziet dat een antwoord er niet toe doet als het doel nutteloos is ;)

Maar goed.. een antwoord (sterker nog, de enige mogelijkheid) heb ik je net gegeven. Een dummy instantie maken van je classes.
Nope dat is geen oplossing, omdat ie dan nog niet alles checked, aleen maar de constructor :)

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

En hier de vraag :
Kun je er binnen PHP voor zorgen dat alle code geparsed en gecheckt wordt
Nee dat kan naar mijn weten niet....
En volgens mij kan dat in geen een programeer taal.

En waarom zou je dat ook willen?

Programmer - an organism that turns coffee into software.


  • vinnux
  • Registratie: Maart 2001
  • Niet online
LuCarD schreef op 26 oktober 2002 @ 23:52:
[...]


Nee dat kan naar mijn weten niet....
En volgens mij kan dat in geen een programeer taal.

En waarom zou je dat ook willen?
MM elke fatsoenlijke programmeertaal doet dat. Java kijkt echt wel of functies in andere klasses bestaan.

  • MikeN
  • Registratie: April 2001
  • Laatst online: 20:47
vgouw schreef op 27 oktober 2002 @ 00:14:
[...]


MM elke fatsoenlijke programmeertaal doet dat. Java kijkt echt wel of functies in andere klasses bestaan.
Je bent nu appels met peren aan het vergelijken. Er zijn script talen zoals PHP en echte programmeer talen zoals Java. Dat zijn verschillende dingen.

  • vinnux
  • Registratie: Maart 2001
  • Niet online
MikeN schreef op 27 oktober 2002 @ 00:23:
[...]

Je bent nu appels met peren aan het vergelijken. Er zijn script talen zoals PHP en echte programmeer talen zoals Java. Dat zijn verschillende dingen.
Ben ik niet mee begonnen he :)

  • CyeZ
  • Registratie: September 2001
  • Laatst online: 13:49

CyeZ

Vroem vroem!!!

Het is simpel: de enige manier om classes volledig te laten controleren is door elke methode minimaal 1x aan te roepen.
Dit zal denk ik wel aardig wat geautomatiseerd kunnen worden door met php uit te lezen over welke methodes een class allemaal bestaat en die dan aan te roepen. Maar denk dat je daar alsnog problemen bij krijgt bij het aanroepen van classes met variabelen (wat moet je dan meegeven? :?)
Dus het een werkje wat veel handwerk kost helaas. Succes ermee.

[18:54] <Prammenhanger> |HunterPro|eet
[18:55] <Prammenhanger> lijkt best op
[18:55] <Prammenhanger> |HunterProFeet


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 29-08 19:47

Bosmonster

*zucht*

CyeZ schreef op 27 oktober 2002 @ 10:00:
Het is simpel: de enige manier om classes volledig te laten controleren is door elke methode minimaal 1x aan te roepen.
Dit zal denk ik wel aardig wat geautomatiseerd kunnen worden door met php uit te lezen over welke methodes een class allemaal bestaat en die dan aan te roepen. Maar denk dat je daar alsnog problemen bij krijgt bij het aanroepen van classes met variabelen (wat moet je dan meegeven? :?)
Dus het een werkje wat veel handwerk kost helaas. Succes ermee.


Tja.. daarom snap ik het niet helemaal, als je een klasse ergens voor schrijft dan test je hem toch direct.. anders heeft het schrijven toch geen nut ;) De klasse moet toch passen in de rest van de code en wordt geschreven met een doel...

Naast het feit of de syntax klopt enzo wil je toch gewoon weten oftie doet wat ie moet doen, of er werkelijk bugs instaan ipv wat lullige typfoutjes? En dat kan echt geen enkele taal voor je... daar zul je echt voor moeten testen.

  • vinnux
  • Registratie: Maart 2001
  • Niet online
Zoiets had ik ook al bedacht om te doen, maar inderdaad kan dat problemen opleveren met de invoervariabelen, aangezien ik niet van te voren kan zien van wat voor een type ze dienen te zijn.

[Bosmonster]
Hier een kleine uitenzetting van de verschillen tussen een programmeertaal, in dit geval Java, en de scripttaal PHP met betrekking tot het "Checken van referenties" van Classes.
Java
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class A {

 public int i;

 public A(){

 }
}

class B {

 private int i;

 public B{
   A a = new A();
   this.i = A.w;
 } 

}

In java zal bovenstaande code leiden tot een compilatie fout op regel " this.i = B.w;", omdat de variabele w niet in de klasse A bestaat.

PHP
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 class A {

 var $i;

 function A(){

 }
}

class B {

 var $i;

 functionB{
    $a = new A();
   $this-&gt;i = $A-&gt;w;
 } 

}

Deze code zal niet leiden tot enige foutmelding. Pas wanneer er een instantie van classe B word gemaakt zal er een foutmelding gegenereet worde.

Conclusie
In talen als Java worden ondelinge referentie gecheck at compile time en niet at runtime.

En ik zou graag willen dat PHP dat ook at parse time deed. Maar dat is onmogelijk op dit moment volgens mij.

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Maar dat is toch logisch?

Compile time en run time zijn het zelfde bij PHP.

Maar wat je zou kunnen doen is in de contructor de dependencies checken. Je maakt in de constructor een lijst gebruikte functies aan. En controleert deze via function_exists. Het zelfde kun je ook doen met Classes en methods.

Maar de vraag is en blijft waarom zou je dat willen?

Programmer - an organism that turns coffee into software.


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 29-08 19:47

Bosmonster

*zucht*

Er is helemaal geen "compile-time" in PHP, aangezien de scripttaal niet gecompileerd, maar geinterpreteerd wordt. Bij compileren moet uiteraard alles kloppen, anders kun je niet eens compileren. Bij een geinterpreteerde taal kun je er je voordeel mee doen dat dit niet hoeft. Het script slaat classes over en bekijkt ze alleen als ze daadwerkelijk geinstantieerd worden. Tel uit je winst in parsetijd!

Het voordeel van een geinterpreteerde taal is dus dat ie runtime kan beslissen wat ie wel en niet parset, iets wat je niet hebt bij een taal als Java. Daarom bestaan in scripttalen ook (ranzige) functies als eval().

Maar leg nu eens uit WAAROM je dit voordeel teniet wilt doen? Testen moet je je code sowieso, dus uitgaande van het feit dat je classe helemaal correcte code is, heeft wat jij wilt echt geen enig nut...

  • vinnux
  • Registratie: Maart 2001
  • Niet online
Motivatie :
Groot deel van het testen kan overgeslagen worden
- Fouten komen sneller tevoorschijn

Motivatie genoeg lijkt mij. En je hoeft mij echt de verschillen niet tussen compile en runtime uit te leggen.

Maar ik heb al door dat het op geen enkele mogelijkheid te doen is, dan door er zelf eeb programma voor te schrijven. Dan ga ik dat maar eens doen.:D

Verwijderd

vgouw schreef op 27 oktober 2002 @ 16:59:
Motivatie :
Groot deel van het testen kan overgeslagen worden
- Fouten komen sneller tevoorschijn
Ik zie niet in hoe je hierdoor 'een groot deel van het testen over kan slaan'.

Ik neem aan dat als je functies schrijft, dat je ze dan ook gebruikt.
En dan zie je eventuele fouten direct.

Wat zou jij dan over kunnen slaan?
Pagina: 1