[snip]
> > > Jeg håber at nogen kan hjælpe med at afklare denne mærkelige
> opførsel,
> > > inden jeg dykker ned i source-koden til PHP-fortolkeren. (Måske
> nogen
> > > der allerede har været der?).
> >
> > Lad os vide hvad du finder.
>
> will do.
Så her er hvad jeg fandt.
I Zend/zend_language_parser.c (linie 2299 - 2310):
case 142:
{ zend_do_declare_property(&yyvsp[0], NULL CLS_CC); ;
break;}
case 143:
{ zend_do_declare_property(&yyvsp[-2], &yyvsp[0] CLS_CC); ;
break;}
case 144:
{ zend_do_declare_property(&yyvsp[0], NULL CLS_CC); ;
break;}
case 145:
{ zend_do_declare_property(&yyvsp[-2], &yyvsp[0] CLS_CC); ;
break;}
Som jeg umiddelbart vil mene svarer til de 4 tilfælde:
var $attrib;
var $attrib = "something"
$this->attrib;
$this->attrib = "something";
Læg mærke til at i case 142 og 144 er andet argument NULL
I filen Zend/zend_compile.c finder vi så funktionen
zend_do_declare_property i linierne: 1611 - 1622:
void zend_do_declare_property(znode *var_name, znode *value CLS_DC)
{
if (value) {
zval *property;
ALLOC_ZVAL(property);
*property = value->u.constant;
zend_hash_update(&CG(active_class_entry)->default_properties,
var_name->u.constant.value.str.val,
var_name->u.constant.value.str.len+1, &property, sizeof(zval *), NULL);
}
FREE_PNODE(var_name);
}
I første statement (if(value)...) ligger humlen så, i tilfældene 142 og
144, vil dette være falsk
og ganske som formodet.. bliver erklæringen så ikke brugt til noget som
helst.
Men hvorfor???
Jeg havde håbet at finde nogle kommentarer i kildekoden, der fortalte
noget, men desværre.
Jeg står tilbage med konstateringen, at det ikke er ulovligt at erklære
en attribut, uden en værdi, men det gør heller ingen til ved parseren.
Og hvorfor det er sådan kan kun blive et gæt.
Jeg gætter på at årsagen til denne opførsel skyldes PHP's
type-håndtering (eller manglen på samme). Når man erklærer en attribut
har PHP ingen ide om hvor meget hukommelse, der skal reserveres til
denne, først i det øjeblik man giver den en værdi, kan der reserveres
plads i hukommelsen, hvilket så må ske faktisk _hver_ gang man giver
attributten en værdi (der findes 2 funktioner vedr. properties nemlig
zend_do_declare_propety() og zend_fetch_property(), men ingen
zend_set_property). I og med at en attribut bliver deklareret hver gang
man tilgår den, kunne man godt have valgt at håndtere attributter
anderledes end variable.
Man kunne have valgt altid at reservere f.eks. en byte til en attribut,
og kontrollere om attributten eksisterede før man skrev til den, dette
ville dog ikke stemme særlig godt overens med PHPs "normale" variable,
som man jo også kan genere on-the-fly.
Og man kunne også mene at den måde PHP gør det på er en optimering mht
til hukommelsesbrug.
Måske ligger årsagen i hash funktionerne, men så langt har jeg ikke lyst
til at dykke.
Jeg er tilfreds med hvad jeg har fundet ud af (eller rettere jeg er
tilfred med at jeg har fundet ud af det), og fastholder at det i det
mindste til enhver tid er god programmerings-skik at deklarere sine
attributter, og hvem ved, måske laver de opførslen om i en fremtidig
version af PHP.
MVH Per Thomsen,
http://www.pert.dk/