php引用
php引用允许两个变量指向同一个内容
$a = &$b;
//$a和$b指向了同一个变量
?>
如果对一个未定义的变量进行引用赋值,引用穿参,则会自动创建该变量
function foo(&$var){}
foo($a);
var_dump($a);
//输出null
$b = array();
foo($b['b']);
var_dump(array_key_exists('b',$b));
//bool true
$c = new stdClass();
foo($c->d);
var_dump(property_exists($c,'d'));
//bool true
如果在一个函数内部给一个声明为global变量赋予一个引用,该引用只在函数内部可见,可以通过使用$GLOBALS数组避免
$var1 = "example variable";
$var2 = "";
function global_references($use_globals){
global $var1,$var2;
if(!$use_globals){
$var2 =& $var1;
}else{
$GLOBALS["var2"] =& $var1;
}
}
global_references(false);
echo "var2 is set to $var2"."";
//"var2 is set to "
global_references(true);
echo "var2 is set to $var2"."";
//"var2 is set to example variable"
取消引用 当unset一个引用,只是断开了变量名和变量内容之间的绑定,并不代表变量的内容被销毁了
$a = 1;
$b =& $a;
unset($a);
?>
函数的引用传递
function test(&$a){
$a = $a +100;
}
$b = 1;
echo $b;//输出1
test($b);
//这里$b传递给函数的其实是$b变量内容所处的内存地址,通过函数里改变$a的值就可以改变$b的值了
echo $b;
函数的引用返回
function &test()
{
static $b=0;//申明一个静态变量
$b=$b+1;
echo $b;
return $b;
}
$a=test();//这条语句会输出 $b的值 为1
$a=5;
$a=test();//这条语句会输出 $b的值 为2
$a=&test();//这条语句会输出 $b的值 为3
//此处a得到的是B的地址
//将A置换为5之后相应的b也会变为A的值
$a=5;
$a=test();//这条语句会输出 $b的值 为6
?>
引用结构出现在面向对象中
class fucker{
private $data = 'hi';
public function &get(){
return $this->data;
}
public function out(){
echo $this->data;
}
}
$q = new fucker();
$d = & $q->get();
$q->out();
$d = 'fuck';
$q->out();
$d = 'u';
$q->out();
$d = 'sir';
$q->out();
//hifuckusir