php函数的传值与传址(引用)详解
发布:smiling 来源: PHP粉丝网 添加日期:2014-02-20 09:43:26 浏览: 评论:0
在php中我们函数传值就比较简单了,但可能有些朋友地天真无邪函数传址或引用搞不明白,下面小编来给各位介绍在php中函数传值与传址(引用)介绍,希望对各位有所帮助。
php中引用的用法:
1. 变量的引用赋值: $a = &$b
2. 函数调用时的引用参数传递
1) 早期php是在调用时通过&符号传递引用类型的变量, 比如: func(&$arg);
2) 后来, 函数的引用类型参数被规定为需要在函数声明时定义, 不如: function func(&$arg);
注:引用声明时定义引用类型参数后,运行时引用参数传递被废弃,需要在php.ini中增加allow_call_time_pass_reference来开启.
3. 函数返回引用类型,这种应用方式需要声明函数时,在函数名前增加&符号,并且,在调用时,要用引用赋值方式, 实例代码如下:
- function &func() {
- return $a;
- }
- $a = func(); //这种调用方式得到的不是引用传值
- $a =& func(); //这样调用才是引用传值
简而言之,就是让函数的返回一个引用类型的值,一个更实际的例子,代码如下:
- $a = 1;
- function &func(&$a) {
- return $a;
- }
- $b = func($a);
- $c =& func($a);
- $b = 2;
- echo "a: $a, b: $b, c: $c. <br />/n";
- //输出a: 1, b: 2, c: 1.
- //可见对$b的修改不会影响$a
- $c = 3;
- echo "a: $a, b: $b, c: $c. <br />/n";
- //输出a: 3, b: 2, c: 3.
- //可见对$c的修改会影响$a
php函数传值的几个细节,如下:
一、基本数据类型的传值
- /* **************************************************** */
- function testvar($k){
- $k = 40;
- }
- $c = 30;
- //给一个函数参数传一个基本数据类型(整型,布尔,字符 ...), 实际上传的就是值 ;
- testvar($c);
- echo $c;//结果是:30
- function testvar2(&$k){
- $k = 40;
- }
- $e = 30;
- //给一个函数参数传一个基本数据类型(整型,布尔,字符 ...), 实际上传的y就是地址 ;
- testvar2($e);
- echo $e;//结果是:40
- /* **************************************************** */
二、数组(默认情况下是复制一份数据),如要传地址则&$arr.
- $arr1 = array(-1,5,0);
- function testArr($arr){
- for($i=0;$i<count ($arr);$i++){
- for($j=$i+1;$j<count($arr);$j++){
- if($arr[$i]>$arr[$j]){
- $temp = $arr[$i];
- $arr[$i] = $arr[$j];
- $arr[$j] = $temp;
- }
- }
- }
- print_r($arr); //结果:Array ( [0] => -1 [1] => 0 [2] => 5 )
- }
- testArr($arr1);
- print_r($arr1); //结果:Array ( [0] => -1 [1] => 5 [2] => 0 )
- function testArr2(&$arr){
- for($i=0;$i</count><count ($arr);$i++){
- for($j=$i+1;$j<count($arr);$j++){
- if($arr[$i]>$arr[$j]){
- $temp = $arr[$i];
- $arr[$i] = $arr[$j];
- $arr[$j] = $temp;
- }
- }
- }
- }
- testArr($arr1);
- print_r($arr1); //结果:Array ( [0] => -1 [1] => 0 [2] => 5 )
- /* **************************************************** */
三、对象数据类型传值
- class person{
- public $name;
- public $age;
- }
- $a = new person();
- $a->name = '小明';
- $a->age = '20';
- //变量a在存的是对象的地址,把a赋给b这个变量,实际上就是赋了一个地址。
- $b = $a;
- $b->age = 30;
- //echo $a->age.$b->age;//结果是:30 30
- //给一个函数参数传一个对象, 实际上传的是这个对象的地址;
- function test($k){
- $k->age =40;
- }
- //调用
- test($b);
- //echo $a->age.$b->age;//结果是:40 40
- </count>
php函数的传值与传址有什么区别呢?对于这样的问题我喜欢通过程序演示来获取答案,让我们来看一个演示记录吧!实例代码如下:
- <?php
- $i=100;
- function func($n){
- $n=$n+100;
- return $n;
- }
- echo '1)函数传值前变量$i的值:'.$i.'<br>';
- echo '2)传值后函数的返回值:'.func($i).'<br>';
- echo '3)函数传值后变量$i的值:'.$i.'<br>';
- echo '4)函数传址前变量$i的值:'.$i.'<br>';
- echo '5)传址后函数的返回值:'.func(&$i).'<br>';
- echo '6)函数传址后变量$i的值:'.$i.'<br>';
- //echo func($i).'<br>';
- ?>
- /*
- 程序输出:
- 1)函数传值前变量$i的值:100
- 2)传值后函数的返回值:200
- 3)函数传值后变量$i的值:100
- 4)函数传址前变量$i的值:100
- 5)传址后函数的返回值:200
- 6)函数传址后变量$i的值:200
- */
解释:
1)直接输出一个赋值$i=100的变量
2)func函数传值返回一个算术相加的结果$=100+100
3)func函数传值,其作用区域只限于函数内部,对外面的变量$i不会有影响
4)同上
5)func函数参数前多了个"&"符,表示传址,和2)一样,返回值是函数的算术运行结果。
6)func(&$i),变量指针指向$i的位置,可以理解为是对变量$i的操作,$i=$i+100;这时变量$i已经相当于重新被赋值
如果去掉上面代码的第18行注释,会得什么结果呢?
小结:传址为了在执行函数的同时,同时改变函数参数值,而传值不期望改变.
Tags: php 函数 传值 引用
相关文章
- ·PHP校验ISBN码的函数(2013-11-11)
- ·PHP不缓存数据头(2013-11-11)
- ·PHP采集程序中常用的函数(2013-11-11)
- ·PHP多重判断删除文件函数(2013-11-11)
- ·php中文汉字截取函数(2013-11-12)
- ·如何用php创建与删除多级目录函数(2013-11-14)
- ·什么函数能够把文件从一个目录下转移到另外一个目录下?(2013-11-27)
- ·php_admin_value(php_admin_flag)和php_value(php_flag)(2013-11-27)
- ·使用PHP重新实现PHP脚本引擎内置函数(2013-11-27)
- ·计算一个程序的执行时间的函数(2013-11-27)
- ·php curl_init函数用法(2013-11-28)
- ·php md5 与md5_file区别详细说明(2013-11-28)
- ·php session_cache_limiter session_cache_expire等函数(2013-11-29)
- ·php var_dump简单测试(2013-11-29)
- ·php file_exists无效解决办法(2013-11-29)
- ·强大的php检查文件类型(2013-11-30)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)