• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

php引用传值实例详解学习_php技巧

php 搞代码 4年前 (2022-01-26) 23次浏览 已收录 0个评论

引用是什么
在 PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针,替代的是,引用是符号表别名。注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身——变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 Unix 文件系统中的 hardlink。
一:变量的引用

<?php<BR>$a =100;<BR>$b = &$a;<BR>echo $b;    //这里输出100<BR>echo $a;    //这里输出100  ,说明$a,和$b的值都是一百。<BR>$b= 200;<BR>echo $a;    //这里输出200<BR>echo $b;    //这里输出200,这就可以看出他们用的是同一个地址。改变一个,另一个也会跟着改变。<BR>?><BR> 


二:函数中引用传值

 <BR><?php<BR>function main($a,$b){<BR>    $b= $a+100;<BR>    return $b;<BR>}<BR>main(55,&$b);      //这里的$b其实就是把它的内存地址传递给函数main中的$b参数,通过参数$b的改变而改变外面的$b的值。<BR>echo<i style="color:transparent">本¥文来源gaodai$ma#com搞$代*码*网(</i><strong>搞代gaodaima码</strong> $b;  //这里会输出155,<BR>?><BR>


三:对象的引用传值
对象的引用

<?<BR>class club{<BR>var $name="real madrid";<BR>}<BR>$b=new club;<BR>$c=$b;<BR>echo $b->name;//这里输出real madrid<BR>echo $c->name;//这里输出real madrid<BR>$b->name="ronaldo";<BR>echo $c->name;//这里输出ronaldo<BR>?> <BR>


取消引用
当你 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。例如:

<?php<BR>$a = 'ronaldo'<BR>$b =&$a;<BR>unset ($a);<BR>?><BR> 


不会 unset $b,只是 $a。

例,引用传递
test1.php

<?php <BR>/** <BR>*   引用传递 <BR>    以下内容可以通过引用传递: <BR>    变量,例如 foo($a) <BR>    New 语句,例如 foo(new foobar()) <BR>    从函数中返回的引用,例如: <br><br>*/<BR>    function foo(&$var) <BR>    { <BR>        $var++; <BR>    } <br><br>    $a=5; <BR>    //合法 <BR>    foo($a); <BR>    foo(new stdClass()); <BR>    //非法使用 <BR>    function bar() // Note the missing & <BR>    { <BR>       $a = 5; <BR>       return $a; <BR>    } <BR>    foo(bar()); // 自 PHP 5.0.5 起导致致命错误 <BR>    foo($a = 5) // 表达式,不是变量 <BR>    foo(5) // 导致致命错误 <br><br>?><BR> 


test2.php

<?php <BR>function test(&$a) <BR>{ <BR>$a=$a+100; <BR>} <BR>$b=1; <BR>echo $b;//输出1 <BR>test($b);   //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了 <br><br>echo "<br>"; <br><br>echo $b;//输出101 <br><br>/***************************** <BR>* <BR>* 这里需要注意 call_user_func_array 后的参数是需要 & <BR>* <BR>* ****************************/<br><br>    //上面的“ test($b); ” 中的$b前面不要加 & 符号,但是在函数“call_user_func_array”中,若要引用传参,就得需要 & 符号,如下代码所示: <br><br>    function a(&$b){ <BR>        $b++; <BR>    } <BR>    $c=0; <BR>    call_user_func_array('a',array(&$c)); <BR>    echo $c; <BR>//输出 1 <BR>?><BR> 


引用返回
引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。不要用返回引用来增加性能,引擎足够聪明来自己进行优化。仅在有合理的技术原因时才返回引用!要返回引用,使用此语法

<?php <BR>function &test() <BR>{ <BR>static $b=0;//申明一个静态变量 <BR>$b=$b+1; <BR>echo $b; <BR>return $b; <BR>} <br><br>    $a=test();//这条语句会输出 $b的值 为1 <BR>    $a=5; <BR>    $a=test();//这条语句会输出 $b的值 为2 <br><br>    $a=&test();//这条语句会输出 $b的值 为3  这里将return $b中的 $b变量的内存地址与$a变量的内存地址 指向了同一个地方 <BR>    $a=5;  //已经改变了 return $b中的 $b变量的值 <br><br>    $a=test();//这条语句会输出 $b的值 为6 <BR>?><BR>


解释:
通过这种方式$a=test();得到的其实不是函数的引用返回,这跟普通的函数调用没有区别 至于原因: 这是PHP的规定
php规定通过$a=&test(); 方式得到的才是函数的引用返回
至于什么是引用返回呢(php手册上说:引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。) 这句狗屁话 害我半天没看懂

用上面的例子来解释就是
$a=test()方式调用函数,只是将函数的值赋给$a而已, 而$a做任何改变 都不会影响到函数中的$b
而通过$a=&test()方式调用函数呢, 他的作用是 将return $b中的 $b变量的内存地址与$a变量的内存地址 指向了同一个地方
即产生了相当于这样的效果($a=&$b;) 所以改变$a的值 也同时改变了$b的值 所以在执行了
$a=&test();
$a=5;
以后,$b的值变为了5

这里是为了让大家理解函数的引用返回才使用静态变量的,其实函数的引用返回多用在对象中
在举一个有意思的例子是在oschina上看到的:

<?php <BR>$a = array('abe','ben','cam'); <BR>foreach ($a as $k=>&$n) <BR>    $n = strtoupper($n); <BR>foreach ($a as $k=>$n) // notice NO reference here! <BR>    echo "$nn"; <BR>print_r($a); <BR>?><BR> 


will result in:

ABE
BEN
BEN
Array
(
[0] => ABE
[1] => BEN
[2] => BEN
)
解释: 在第二个foreach中循环如下:
Array
(
[0] => ABE
[1] => BEN
[2] => ABE
)
Array
(
[0] => ABE
[1] => BEN
[2] => BEN
)
Array
(
[0] => ABE
[1] => BEN
[2] => BEN
)
因为没有unset($n),所以它始终指向数组的最后一个元素,第二个foreach里第一次循环把$n,也就是$a[2]改成了ABE,第二次循环改成了BEN,第三次就也是BEN了。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:php引用传值实例详解学习_php技巧

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址