最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • PHP引用的秘密(二)函数中的引用

    正文概述 转载于:掘金(传达室老大爷)   2021-06-16   381

    函数内的引用,其实不过是把我们上一节所讲的核心逻辑,套上了函数的外衣,本质是一样的.

    引用传值 & 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全局变量;但可以通过在函数内部调用超全局变量var 不会 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()和引用型函数, 我们下一节讲解数组里面的引用.


    起源地下载网 » PHP引用的秘密(二)函数中的引用

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元