函数内的引用,其实不过是把我们上一节所讲的核心逻辑,套上了函数的外衣,本质是一样的.
引用传值 & global
函数通过传参,默认只会在函数内部改变参数的值,并不会改变函数外部的值。如果希望通过函数改变外部变量,必须通过引用传值。引用传值只需要在函数定义的参数前面加'&'即可。
function SO(&$b){
$b++;
}
$b=5;
SO($b);
var_dump($b); //int(6)
在不需要return的情况下,$b的值被函数改变了。
引用传递就是将参数的内存地址传到函数参数,函数内部的所有操作都会影响到调用者参数的值。
我们再看一下global引用的例子。在函数中使用global可以直接与外部变量建立引用关系:
$a='test';
$b='done';
function Sorted(){
global $a,$b; //建立于外部变量的引用关系
$a.=$b; //此时对$a进行新的赋值
}
Sorted();
echo $a; // testdone
用global $var声明一个变量时, 实际上建立了一个到全局变量的引用。相当于:
$var =& $GLOBALS["var"]
;
在函数内部,也可以通过引用内部变量进行赋值,但该引用只在函数内部可见:
$a='test';
$b='done';
function Sorted(){
global $a,$b;
$a=&$b; //将$a对'test'的引用,变为对'done'的引用;
echo $a;//done, 在函数内部生效;
}
Sorted();
echo $a; // test,函数外部变量没有变化
可以通过超全局变量$GLOBALS[ ]来实现,在函数内部对外部变量的直接操作.
$a='test';
$b='done';
function Sorted(){
global $a,$b;
$GLOBAL['$a']=&$b; //直接对全局变量$a进行引用赋值;
}
Sorted();
echo $a; // done
取消引用
回顾一下核心逻辑,php引用,实际上是建立引用关系,而取消引用,实际上是删除了之间的引用关系,并不会对变量值和其他变量有影响.
好的,我们来看一下在函数中的应用.
在函数中,取消引用同样是2个方式,一个是unset(),一个是改变其引用.
unset删除的是函数内参数与外部变量的引用关系,所以不会对外部变量有影响,举例:
function change( & $y ){
unset( $y ); //在这一步把&引用关系删除了,所以无论$y如何变动,都与$x无瓜;
$y = 'q23';
}
$x = 'x';
change($x);
echo $x; //'x'
所以unset var不会unset全局变量;但可以通过在函数内部调用超全局变量GLOBAL()来实现对外部全局变量引用关系的删除,举例:
function sorted(){
global $bar; //引用外部变量
unset($GLOBALS['bar']); //直接删除外部变量名的引用关系
echo $bar; //something,函数内部参数的引用关系仍然存在,但仅在函数内部可见
}
$bar = 'something';
sorted();
echo $bar; //Undefined variable $bar,外部变量名已经删除;
我们再看一下,通过给函数内部变量重新引用赋值,来取消原有引用赋值的例子:
function func_a (& $par){
//这个时候$par引用还是$var
$some_var = 2;
$par = & $some_var; //这个时候引用变成了$some_var
$par++; //对外部变量没有影响
}
$var = 1;
func_a($var); //int(1)
这个其实和上一节提到的普通引用赋值是完全一样的,只不过套了一个函数的外衣.
引用返回 & and return
引用返回与普通return的区别在于:普通return只会影响被赋值变量一次;而引用型的return,在每次函数被调用之后,都会影响被赋值变量. 这也合乎引用的核心逻辑.
使用方法:引用型函数的定义,在函数名前加'&'即可;在赋值时,和普通赋值一样,需要在函数名前加'&',但是在被另一个函数调用时,不需要加&.
举例:
function &color() {
static $c1 = array(1,2,3);
$c1[]='test'; //每次调用,都为数组添加一个值;
return $c1; //返回新数组;
}
$tion1 = &color(); // 调用函数,并进行引用赋值,建立引用关系;
$tion1[] = 'foo'; //并为数组添加一个值foo
$tion2=collector(); //调用函数,普通赋值,没有建立引用关系
collector(); // 再次调用函数,添加一个test
print_r($tion1);//[1,2,3,test,foo,test,test],4次调用,都会对变量值有影响
print_r($tion2);//[1,2,3,test,foo,test]只有前3次有影响,赋值后,变量值没有变化
再看一个直接调用引用型函数返回值的例子:
function four($var){ //定义函数用来接收five()的返回值;
$var++;
return $var;
}
function &five(){
$b=5;
return $b;
}
var_dump(four(five())); //int(6)
注意:引用型函数只有return值是可以直接被引用的,其中的参数并没有和外部全局变量有引用关系,如果想建立这种引用关系,仍然需要在函数内部变量前加&,或global
比如下面这例:
function &five($a){
$a=5;
return $a;
}
$a=2;
five($a);
echo $a; //仍然是2;
以上就是PHP函数中引用的讲解, 其实万变不离其宗, 比较特殊就是$GLOBALS()和引用型函数, 我们下一节讲解数组里面的引用.
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!