lsb_018.phpt 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. --TEST--
  2. ZE2 Late Static Binding and Singleton
  3. --FILE--
  4. <?php
  5. abstract class Singleton
  6. {
  7. static private $instances = array();
  8. static private $nextInstanceId = 0;
  9. private $instanceId = NULL;
  10. static final public function getInstance()
  11. {
  12. $caller = get_called_class();
  13. if (!isset(self::$instances[$caller])) {
  14. self::$instances[$caller] = new $caller;
  15. self::$instances[$caller]->instanceId = self::$nextInstanceId++;
  16. }
  17. return self::$instances[$caller];
  18. }
  19. public final function getInstanceId()
  20. {
  21. return $this->instanceId;
  22. }
  23. public final function identify()
  24. {
  25. var_dump($this);
  26. }
  27. }
  28. class Foo extends Singleton {
  29. }
  30. class Bar extends Singleton {
  31. }
  32. class Baz extends Bar {
  33. }
  34. $u = Foo::getInstance();
  35. $v = Bar::getInstance();
  36. $w = Baz::getInstance();
  37. $u->identify();
  38. $v->identify();
  39. $w->identify();
  40. $x = Foo::getInstance();
  41. $y = Bar::getInstance();
  42. $z = Baz::getInstance();
  43. $u->identify();
  44. $v->identify();
  45. $w->identify();
  46. $x->identify();
  47. $y->identify();
  48. $z->identify();
  49. ?>
  50. ===DONE===
  51. --EXPECTF--
  52. object(Foo)#%d (1) {
  53. ["instanceId":"Singleton":private]=>
  54. int(0)
  55. }
  56. object(Bar)#%d (1) {
  57. ["instanceId":"Singleton":private]=>
  58. int(1)
  59. }
  60. object(Baz)#%d (1) {
  61. ["instanceId":"Singleton":private]=>
  62. int(2)
  63. }
  64. object(Foo)#%d (1) {
  65. ["instanceId":"Singleton":private]=>
  66. int(0)
  67. }
  68. object(Bar)#%d (1) {
  69. ["instanceId":"Singleton":private]=>
  70. int(1)
  71. }
  72. object(Baz)#%d (1) {
  73. ["instanceId":"Singleton":private]=>
  74. int(2)
  75. }
  76. object(Foo)#%d (1) {
  77. ["instanceId":"Singleton":private]=>
  78. int(0)
  79. }
  80. object(Bar)#%d (1) {
  81. ["instanceId":"Singleton":private]=>
  82. int(1)
  83. }
  84. object(Baz)#%d (1) {
  85. ["instanceId":"Singleton":private]=>
  86. int(2)
  87. }
  88. ===DONE===