1--TEST-- 2ZE2 factory and singleton, test 2 3--SKIPIF-- 4<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?> 5--FILE-- 6<?php 7class test { 8 protected $x; 9 10 static private $test = NULL; 11 static private $cnt = 0; 12 13 static function factory($x) { 14 if (test::$test) { 15 return test::$test; 16 } else { 17 test::$test = new test($x); 18 return test::$test; 19 } 20 } 21 22 protected function __construct($x) { 23 test::$cnt++; 24 $this->x = $x; 25 } 26 27 static function destroy() { 28 test::$test = NULL; 29 } 30 31 protected function __destruct() { 32 test::$cnt--; 33 } 34 35 public function get() { 36 return $this->x; 37 } 38 39 static public function getX() { 40 if (test::$test) { 41 return test::$test->x; 42 } else { 43 return NULL; 44 } 45 } 46 47 static public function count() { 48 return test::$cnt; 49 } 50} 51 52echo "Access static members\n"; 53var_dump(test::getX()); 54var_dump(test::count()); 55 56echo "Create x and y\n"; 57$x = test::factory(1); 58$y = test::factory(2); 59var_dump(test::getX()); 60var_dump(test::count()); 61var_dump($x->get()); 62var_dump($y->get()); 63 64echo "Destruct x\n"; 65$x = NULL; 66var_dump(test::getX()); 67var_dump(test::count()); 68var_dump($y->get()); 69 70echo "Destruct y\n"; 71$y = NULL; 72var_dump(test::getX()); 73var_dump(test::count()); 74 75//echo "Destruct static\n"; 76//test::destroy(); 77//var_dump(test::getX()); 78//var_dump(test::count()); 79 80echo "Done\n"; 81?> 82--EXPECT-- 83Access static members 84NULL 85int(0) 86Create x and y 87int(1) 88int(1) 89int(1) 90int(1) 91Destruct x 92int(1) 93int(1) 94int(1) 95Destruct y 96int(1) 97int(1) 98Done 99 100Warning: Call to protected test::__destruct() from context '' during shutdown ignored in Unknown on line 0 101