⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bug20175.phpt

📁 php-4.4.7学习linux时下载的源代码
💻 PHPT
字号:
--TEST--Bug #20175 (Static vars can't store ref to new instance)--SKIPIF--<?php if (version_compare(zend_version(),'2.0.0-dev','<')) die('skip ZE1 does not have static class members');--FILE--<?phpprint zend_version()."\n";/* Part 1: * Storing the result of a function in a static variable. * foo_global() increments global variable $foo_count whenever it is executed. * When foo_static() is called it checks for the static variable $foo_value * being initialised. In case initialisation is necessary foo_global() will be * called. Since that must happen only once the return value should be equal. */$foo_count = 0;function foo_global() {	global $foo_count;	echo "foo_global()\n";	return 'foo:' . ++$foo_count;}function foo_static() {	static $foo_value;	echo "foo_static()\n";	if (!isset($foo_value)) {		$foo_value = foo_global();	}	return $foo_value;}/* Part 2: * Storing a reference to the result of a function in a static variable. * Same as Part 1 but: * The return statment transports a copy of the value to return. In other  * words the return value of bar_global() is a temporary variable only valid * after the function call bar_global() is done in current local scope. */$bar_count = 0;function bar_global() {	global $bar_count;	echo "bar_global()\n";	return 'bar:' . ++$bar_count;}function bar_static() {	static $bar_value;	echo "bar_static()\n";	if (!isset($bar_value)) {		$bar_value = &bar_global();	}	return $bar_value;}/* Part 3: TO BE DISCUSSED * * Storing a reference to the result of a function in a static variable. * Same as Part 2 but wow_global() returns a reference so $wow_value * should store a reference to $wow_global. Therefor $wow_value is already * initialised in second call to wow_static() and hence shouldn't call * wow_global() again. */ /*$wow_count = 0;$wow_name = '';function &wow_global() {	global $wow_count, $wow_name;	echo "wow_global()\n";	$wow_name = 'wow:' . ++$wow_count;	return $wow_name;}function wow_static() {	static $wow_value;	echo "wow_static()\n";	if (!isset($wow_value)) {		$wow_value = &wow_global();	}	return $wow_value;}*//* Part 4: * Storing a reference to a new instance (that's where the name of the  test * comes from). First there is the global counter $oop_global again which  * counts the calls to the constructor of oop_class and hence counts the  * creation of oop_class instances. * The class oop_test uses a static reference to a oop_class instance. * When another oop_test instance is created it must reuse the statically * stored reference oop_value. This way oop_class gets some singleton behavior * since it will be created only once for all insatnces of oop_test. */$oop_global = 0;class oop_class {	var $oop_name;		function oop_class() {		global $oop_global;		echo "oop_class()\n";		$this->oop_name = 'oop:' . ++$oop_global;	}}class oop_test {	static $oop_value;		function oop_test() {		echo "oop_test()\n";	}		function oop_static() {		echo "oop_static()\n";		if (!isset(self::oop_value)) {			self::oop_value = & new oop_class;		}		echo self::oop_value->oop_name;	}}print foo_static()."\n";print foo_static()."\n";print bar_static()."\n";print bar_static()."\n";//print wow_static()."\n";//print wow_static()."\n";echo "wow_static()wow_global()wow:1wow_static()wow:1";$oop_tester = new oop_test;print $oop_tester->oop_static()."\n";print $oop_tester->oop_static()."\n";$oop_tester = new oop_test; // repeated.print $oop_tester->oop_static()."\n";?>--EXPECTF--%sfoo_static()foo_global()foo:1foo_static()foo:1bar_static()bar_global()bar:1bar_static()bar_global()bar:2wow_static()wow_global()wow:1wow_static()wow:1oop_test()oop_static()oop_class()oop:1oop_static()oop:1oop_test()oop_static()oop:1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -