如:$b=new a,其中new a产生的是一个匿名的a对象实例,而此时的$b是对这个匿名对象的拷贝。同理$c=$b,也是对$b内容的一个拷贝。所以在php4中,为了节省内存空间,$b=new a 一般会改成引用的模式,即 $b=& new a。
下面再来个 官方 提供的例子:
在php5中,你不需要额外添加什么东西就可到达“对象引用”的功能:
class foo{ protected $name; function __construct($str){ $this->name = $str; } function __toString(){ return 'my name is "'. $this->name .'" and I live in "' . __CLASS__ . '".' . "\n"; } function setName($str){ $this->name = $str; } }
class MasterOne{ protected $foo; function __construct($f){ $this->foo = $f; } function __toString(){ return 'Master: ' . __CLASS__ . ' | foo: ' . $this->foo . "\n"; } function setFooName($str){ $this->foo->setName( $str ); } }
class MasterTwo{ protected $foo; function __construct($f){ $this->foo = $f; } function __toString(){ return 'Master: ' . __CLASS__ . ' | foo: ' . $this->foo . "\n"; } function setFooName($str){ $this->foo->setName( $str ); } }
$bar = new foo('bar');
print("\n"); print("Only Created \$bar and printing \$bar\n"); print( $bar );
print("\n"); print("Now \$baz is referenced to \$bar and printing \$bar and \$baz\n"); $baz =& $bar; print( $bar );
print("\n"); print("Now Creating MasterOne and Two and passing \$bar to both constructors\n"); $m1 = new MasterOne( $bar ); $m2 = new MasterTwo( $bar ); print( $m1 ); print( $m2 );
print("\n"); print("Now changing value of \$bar and printing \$bar and \$baz\n"); $bar->setName('baz'); print( $bar ); print( $baz );
print("\n"); print("Now printing again MasterOne and Two\n"); print( $m1 ); print( $m2 );
print("\n"); print("Now changing MasterTwo's foo name and printing again MasterOne and Two\n"); $m2->setFooName( 'MasterTwo\'s Foo' ); print( $m1 ); print( $m2 );
7.global 引用 当用 global $var 声明一个变量时实际上建立了一个到全局变量的引用。也就是说和这样做是相同的:
$var =& $GLOBALS["var"]; ?>
这意味着,例如,unset $var 不会 unset 全局变量。
如果在一个函数内部给一个声明为 global 的变量赋于一个引用,该引用只在函数内部可见。可以通过使用 $GLOBALS 数组避免这一点。
Example 在函数内引用全局变量
$var1 = "Example variable"; $var2 = "";
function global_references($use_globals) { global $var1, $var2; if (!$use_globals) { $var2 =& $var1; // visible only inside the function } else { $GLOBALS["var2"] =& $var1; // visible also in global context } }
global_references(false); echo "var2 is set to '$var2'\n"; // var2 is set to '' global_references(true); echo "var2 is set to '$var2'\n"; // var2 is set to 'Example variable' ?>
把 global $var; 当成是 $var =& $GLOBALS['var']; 的简写。从而将其它引用赋给 $var 只改变了本地变量的引用。
网友评论
文明上网理性发言,请遵守 新闻评论服务协议
我要评论