PHP ile tuhaf Davranış (5.3), statik miras ve referanslar

0 Cevap php

PHP 5.3 bir kitaplık yazıyorum, toplu sıfır conf çocuk sınıflar için izin vermek için alt sınıflar tarafından uzatılır birkaç statik özelliklere sahip bir sınıftır.

Her neyse, burada bulduk özelliğe göstermek için bir örnek:

<?php

class A {
    protected static $a;
    public static function out() { var_dump(static::$a); }
    public static function setup($v) { static::$a =& $v; }
}
class B extends A {}
class C extends A {}

A::setup('A');
A::out(); // 'A'
B::out(); // null
C::out(); // null

B::setup('B');
A::out(); // 'A'
B::out(); // 'B'
C::out(); // null

C::setup('C');
A::out(); // 'A'
B::out(); // 'B'
C::out(); // 'C'

?>

Şimdi, bu hemen hemen kadarıyla endişeleniyorum gibi statik miras için davranış istenen, ancak, ben beklenen davranış almak static::$a =& $v; static::$a = $v; (hayır referans) değişen, yani :

'A'
'A'
'A'

'B'
'B'
'B'

'C'
'C'
'C'

Bu yüzden kimse açıklayabilir misiniz? Ben herhangi bir şekilde nasıl referanslar etkisi statik miras anlayamıyorum :/

Update:

Artefacto's answer, taban sınıftaki aşağıdaki yöntemi (bu örnekte, A) sahip ve sınıf bildirimleri sonra çağırarak belirleyiciler içinde referans olarak atamak için gerek kalmadan yukarıdaki 'arzu' olarak etiketlenmiş davranış üreten dayanarak , kendini kullanırken :: yukarıda 'beklenen' bir davranış olarak sonuçları terk ederken.

/*...*/
public static function break_static_references() {
    $self = new ReflectionClass(get_called_class());
    foreach($self->getStaticProperties() as $var => $val)
        static::$$var =& $val;
}
/*...*/
A::break_static_references();
B::break_static_references();
C::break_static_references();
/*...*/

0 Cevap