## 函数的传值和传引用 **所谓值传递** 就是说仅将对象的值传递给目标对象,就相当于copy;系统将为目标对象**重新开辟一个完全相同的内存空间**。 **所谓引用** 就是说将对象在内存中的地址传递给目标对象,就相当于使目标对象和原始对象对应**同一个内存存储空间**。此时,如果对目标对象进行修改,内存中的数据也会改变。 **引用的作用** 如果程序比较大,引用同一个对象的变量比较多,并且希望用完该对象后手工清除它,个人建议用 "&" 方式,然后用$var=null的方式清除. 其它时候还是用php5的默认方式吧. 另外, php5中对于大数组的传递,建议用 "&" 方式, 毕竟节省内存空间使用。 **取消引用** 当你 `unset` 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。 ```php $a = 1; $b = &$a; unset($a); echo $b; // 1 ``` > unset并没有真正销毁变量的作用,仅仅是切断了变量与内存之间的关系,内存只要还被引用着就不会被释放; $b和$a同时指向1,切断其中$a的关系,$b还是指向1,所以上题不报错,照样输出1。 > **注意:** 在PHP中对象的传值默认是引用传值 >[success] 变量方向理解 * **传值:** 是把实参的值赋值给形参,那么对形参的修改,不会影响实参的值 * **传地址:** 是传值的一种特殊方式,只是他传递的是地址,不是普通的如int,那么传地址以后,实参和形参都指向同一个对象 * **传引用:** 真正的以地址的方式传递参数,传递以后,形参和实参都是同一个对象,只是他们名字不同而已,对形参的修改将影响实参的值 * 案例01 ```php // 传值 $var01 = 1; $var02 = 2; $var02 = $var01; $var01 = 3; // 变量$var01和变量$var02是两块内存,互不影响 echo $var02; // 输出 1 echo "\n"; // 传地址 $var03 = 1; $var04 = 2; $var04 = &$var03; // 把变量 $var03的内存地址赋给变量$var04;此时的变量$var04和变量$var03全等; $var03 = 33; // 变量 $var03 和 $var04 是一处内存,改变其中一个,另外一个也被改变; echo $var04; // 输出 33 ``` >[warning] 普通函数 * 传值 是把实参的值赋值给形参,那么对形参的修改,不会影响实参的值 * 传地址 是传值的一种特殊方式,只是他传递的是地址,不是普通的如int,那么传地址以后,实参和形参都指向同一个对象 * 传引用 真正的以地址的方式传递参数,传递以后,形参和实参都是同一个对象,只是他们名字不同而已,对形参的修改将影响实参的值 * 案例02 ```php // 普通函数的传值 $a = 10; function add($a) { $a = 20; echo $a . "\n"; // 20 } add($a); echo $a . "\n"; // 10 // 普通函数的引用传值 // 调用方法 add_address,并将变量$a的引用传给变量 $b,此时两个地址指向同一内存,改变其中一个,另外一个也要被改变; function add_address(&$a) { echo $a . "\n"; // 10 $a = 20; echo $a . "\n"; // 20 return $a; } $b = add_address($a); echo $a . "\n"; // 20 echo $b . "\n"; // 20 ``` >[danger] 系统函数 * 传值系统函数 `strtolower` 含义:将字符串转化为小写 语法:`string strtolower ( string $string )` //这里是传递值 ```php $str = "Tinywan"; $str2 = strtolower($str); var_dump($str, $str2); // Tinywan tinywan ``` * 传地址系统函数 `array_pop` 含义:弹出数组最后一个单元(出栈) 语法:`mixed array_pop ( array &$array )` // 这里是传地址 ```php $tmp_arr = [1,2,3,4]; var_dump($tmp_arr); // 弹出之前 array(4) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) } array_pop($tmp_arr); var_dump($tmp_arr); // 弹出之后 array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } ``` >[success] 自定义函数 ```php // 去变量的值 function fun($param) { $param += 20; var_dump($param); // 30 } $tmp = 10; fun($tmp); // 30 var_dump($tmp); // 10 // 去变量的地址 function fun_add(&$param) { $param += 20; var_dump($param); // 30 } $tmp = 10; fun_add($tmp); // 30 var_dump($tmp); // 30 ```