In navolging van de reactie van creepy op: [PHP] Class casten onmogelijk? hierbij mijn probleem.
Ik wil graag een function overriden van een classe. In deze functie wordt gebruik gemaakt van het keyword self, waarmee er nieuwe instanties van zichzelf worden aangemaakt. Op het moment dat ik de klasse extend maakt hij instanties aan van de orginele classe ipv de classe die extend. Een stukje code om dit toe te lichten:
Ik zou een instantie van classe B verwachten. Om dit probleem op een andere manier op te lossen heb ik geprobeerd $o->a te casten naar B
Dit geeft echter een parse error.
Het probleem is op te lossen door keyword self te vervangen door $this, waardoor de binding later gebeurt, ware het niet dat classe A een classe is van Zend Framework en het dus beter is om dit niet aan te passen.
Wie weet er een goede workaround?
P.S. Heeft dit trouwens te maken met Late Static Binding (zie: http://blog.felho.hu/what...-late-static-binding.html)? Dit wordt opgelost in versie 5.3 van php.
Ik wil graag een function overriden van een classe. In deze functie wordt gebruik gemaakt van het keyword self, waarmee er nieuwe instanties van zichzelf worden aangemaakt. Op het moment dat ik de klasse extend maakt hij instanties aan van de orginele classe ipv de classe die extend. Een stukje code om dit toe te lichten:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| class A { public $a; function __construct($iDepth) { if ($iDepth==1) { $this->a = new self(0); } } } class B extends A { function __construct($iDepth) { parent::__construct($iDepth); } } $o = new B(1); var_dump($o->a); //output: // object(A)#2 (1) { ["a"]=> NULL } |
Ik zou een instantie van classe B verwachten. Om dit probleem op een andere manier op te lossen heb ik geprobeerd $o->a te casten naar B
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| class A { public $a; function __construct($iDepth) { if ($iDepth==1) { $this->a = new self(0); } } } class B extends A { function __construct($iDepth) { parent::__construct($iDepth); } } $o = new B(1); $o->a = (B)$o->a; |
Dit geeft echter een parse error.
Het probleem is op te lossen door keyword self te vervangen door $this, waardoor de binding later gebeurt, ware het niet dat classe A een classe is van Zend Framework en het dus beter is om dit niet aan te passen.
Wie weet er een goede workaround?
P.S. Heeft dit trouwens te maken met Late Static Binding (zie: http://blog.felho.hu/what...-late-static-binding.html)? Dit wordt opgelost in versie 5.3 van php.