lsb_018.phpt 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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. --EXPECTF--
  51. object(Foo)#%d (1) {
  52. ["instanceId":"Singleton":private]=>
  53. int(0)
  54. }
  55. object(Bar)#%d (1) {
  56. ["instanceId":"Singleton":private]=>
  57. int(1)
  58. }
  59. object(Baz)#%d (1) {
  60. ["instanceId":"Singleton":private]=>
  61. int(2)
  62. }
  63. object(Foo)#%d (1) {
  64. ["instanceId":"Singleton":private]=>
  65. int(0)
  66. }
  67. object(Bar)#%d (1) {
  68. ["instanceId":"Singleton":private]=>
  69. int(1)
  70. }
  71. object(Baz)#%d (1) {
  72. ["instanceId":"Singleton":private]=>
  73. int(2)
  74. }
  75. object(Foo)#%d (1) {
  76. ["instanceId":"Singleton":private]=>
  77. int(0)
  78. }
  79. object(Bar)#%d (1) {
  80. ["instanceId":"Singleton":private]=>
  81. int(1)
  82. }
  83. object(Baz)#%d (1) {
  84. ["instanceId":"Singleton":private]=>
  85. int(2)
  86. }