5
Warum new static
in der Schließung (in einer Klasse static
Methode) ist gleich new self
in PHP5.5, während es in PHP5.6 ordnungsgemäß gebunden ist?späte statische Bindung in Schließung PHP5.5 vs 5.6
Gegeben:
abstract class Parent {
public function __construct($something)
{
$this->something = $something;
}
public static function make($array)
{
return array_map(function ($el) {
return new static($el);
}, $array);
}
}
class Child extends Parent {
}
dann
Child::make($someArray);
// PHP5.5 FatalError: cannot instantiate abstract class Parent
// PHP5.6 works fine, as expected
In 5.5 wird dies wie erwartet:
public static function make($array)
{
$child = get_called_class();
return array_map(function ($el) use ($chlid) {
return new $child($el);
}, $array);
}
aber warum ist das passiert? Ich habe auf php.net keine Erwähnung bezüglich statischer Bindungsänderungen in 5.6 gefunden.
Ja. Noch interessanter ist, dass es bereits in [5.4.30] (http://3v4l.org/lk4i0#v5430) durch 5.4.38 behoben wurde, aber anscheinend nicht in 5.5.0 enthalten ist. Danke –
@ JarekTkaczyk: php unterstützt mehrere Zweige zu einer Zeit, so dass alle 5.4. * Nicht unbedingt vor 5.5. *. In diesem Fall wurden 5.4.30 und 5.5.14 am selben Tag veröffentlicht (http://php.net/ChangeLog-5.php). – georg
Sicher. Ich war mir der Veröffentlichungstermine nicht bewusst :) –