Ostatnio spotkałem się z ciekawym "bugiem" który podobno nim nie jest. Ciekawy jestem jakie jest Wasze zdanie na ten temat.
Mam kod:
<?php interface A { http://www.php.net/static function create(); } abstract class B implements A { protected http://www.php.net/static $instance; protected function __construct() { } public http://www.php.net/static function getInstance() { if (http://www.php.net/static::$instance === null) { http://www.php.net/static::$instance = http://www.php.net/static::create(); } return http://www.php.net/static::$instance; } } class C { private $number; public function __construct($number) { $this->number = $number; } public function getNumber() { return $this->number; } } class D extends B { http://www.php.net/static function create() { return new C(1); } } class G extends B { http://www.php.net/static function create() { return new C(2); } } http://www.php.net/echo "a = " . D::getInstance()->getNumber() . PHP_EOL; http://www.php.net/echo "b = " . G::getInstance()->getNumber() . PHP_EOL;
abstract class F implements A { protected http://www.php.net/static $instance; protected function __construct() { } public http://www.php.net/static function getInstance() { if (http://www.php.net/static::$instance === null) { $t = ''; http://www.php.net/static::$instance =& $t; http://www.php.net/static::$instance = http://www.php.net/static::create(); } return http://www.php.net/static::$instance; } } class E extends F { http://www.php.net/static function create() { return new C(3); } } class H extends F { http://www.php.net/static function create() { return new C(4); } } http://www.php.net/echo "c = " . E::getInstance()->getNumber() . PHP_EOL; http://www.php.net/echo "d = " . H::getInstance()->getNumber() . PHP_EOL;
<?php class B { http://www.php.net/static $number; } class C extends B { } class G extends B { } B::$number = 5; http://www.php.net/echo C::$number . PHP_EOL; http://www.php.net/echo G::$number . PHP_EOL; C::$number = 2; http://www.php.net/echo C::$number . PHP_EOL; http://www.php.net/echo G::$number . PHP_EOL; $t = 11; C::$number =& $t; http://www.php.net/echo C::$number . PHP_EOL; http://www.php.net/echo G::$number . PHP_EOL;
Static odnosi się do klasy jako kontenera, a nie do obiektu tej klasy. Klasa abstrakcyjna daje możliwość utworzenia "tak jakby" interfejsu, już z predefiniowanymi metodami, które klasa dziedzicząca wspóldzieli. Odwołania statyczne do klasy mają się nijak do tworzenia obiektów. Dlatego static::$zmienna działa dla klasy abstrakcyjnej. A to, do której ona klasy należy, to już zależy od dziedziczenia. Powinno się używać static od klasy w której jest to zdefiniowane.
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)