1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- --TEST--
- ZE2 Late Static Binding and Singleton
- --FILE--
- <?php
- abstract class Singleton
- {
- static private $instances = array();
- static private $nextInstanceId = 0;
- private $instanceId = NULL;
- static final public function getInstance()
- {
- $caller = get_called_class();
- if (!isset(self::$instances[$caller])) {
- self::$instances[$caller] = new $caller;
- self::$instances[$caller]->instanceId = self::$nextInstanceId++;
- }
- return self::$instances[$caller];
- }
- public final function getInstanceId()
- {
- return $this->instanceId;
- }
- public final function identify()
- {
- var_dump($this);
- }
- }
- class Foo extends Singleton {
- }
- class Bar extends Singleton {
- }
- class Baz extends Bar {
- }
- $u = Foo::getInstance();
- $v = Bar::getInstance();
- $w = Baz::getInstance();
- $u->identify();
- $v->identify();
- $w->identify();
- $x = Foo::getInstance();
- $y = Bar::getInstance();
- $z = Baz::getInstance();
- $u->identify();
- $v->identify();
- $w->identify();
- $x->identify();
- $y->identify();
- $z->identify();
- ?>
- ===DONE===
- --EXPECTF--
- object(Foo)#%d (1) {
- ["instanceId":"Singleton":private]=>
- int(0)
- }
- object(Bar)#%d (1) {
- ["instanceId":"Singleton":private]=>
- int(1)
- }
- object(Baz)#%d (1) {
- ["instanceId":"Singleton":private]=>
- int(2)
- }
- object(Foo)#%d (1) {
- ["instanceId":"Singleton":private]=>
- int(0)
- }
- object(Bar)#%d (1) {
- ["instanceId":"Singleton":private]=>
- int(1)
- }
- object(Baz)#%d (1) {
- ["instanceId":"Singleton":private]=>
- int(2)
- }
- object(Foo)#%d (1) {
- ["instanceId":"Singleton":private]=>
- int(0)
- }
- object(Bar)#%d (1) {
- ["instanceId":"Singleton":private]=>
- int(1)
- }
- object(Baz)#%d (1) {
- ["instanceId":"Singleton":private]=>
- int(2)
- }
- ===DONE===
|