Mam kod:
<?php interface A { } abstract class B implements A { protected function __construct() { } { } } } class C { private $number; public function __construct($number) { $this->number = $number; } public function getNumber() { return $this->number; } } class D extends B { return new C(1); } } class G extends B { return new C(2); } }
Jakie Twoim zdaniem wartości powinno mieć a i b? (fajnie jakbyś nie wykonywał tego kodu przed odpowiedzią)
Następnie do powyższego kodu dodamy 3 nowe klasy:
abstract class F implements A { protected function __construct() { } { $t = ''; } } } class E extends F { return new C(3); } } class H extends F { return new C(4); } }
Jakie wartości będzie mieć c i d?
Jak wiadomo static użyte w klasie powinno kierować do "ostatniej" w hierarchii klasy. Jednak static w klasach abstrakcyjnych wydaje się być jakimś innym tworem - być może dlatego, że self w takich klasach nie może istnieć. Jeżeli zrobimy jednak zabieg z klasy F w getInstance static znowu jest tym "normalnym" static. Przez normalnym mam na myśli zachowanie które uważam za prawidłowe - obiekt klasy abstrakcyjnej nie może istnieć dlaczego więc static klasy abstrakcyjniej może?
Tym sposobem możemy też sprawić aby static nie był static w zwykłych klasach:
<?php class B { } class C extends B { } class G extends B { } B::$number = 5; C::$number = 2; $t = 11; C::$number =& $t;