在php中我們函數(shù)傳值就比較簡單了,但可能有些朋友地天真無邪函數(shù)傳址或引用搞不明白,下面小編來給各位介紹在php中函數(shù)傳值與傳址(引用)介紹,希望對各位有所幫助。
php中引用的用法:
1. 變量的引用賦值: $a = &$b
2. 函數(shù)調(diào)用時的引用參數(shù)傳遞
1) 早期php是在調(diào)用時通過&符號傳遞引用類型的變量, 比如: func(&$arg);
2) 后來, 函數(shù)的引用類型參數(shù)被規(guī)定為需要在函數(shù)聲明時定義, 不如: function func(&$arg);
注:引用聲明時定義引用類型參數(shù)后,運行時引用參數(shù)傳遞被廢棄,需要在php.ini中增加allow_call_time_pass_reference來開啟.
3. 函數(shù)返回引用類型,這種應(yīng)用方式需要聲明函數(shù)時,在函數(shù)名前增加&符號,并且,在調(diào)用時,要用引用賦值方式, 實例代碼如下:
- function &func() {
- return $a;
- }
- $a = func(); //這種調(diào)用方式得到的不是引用傳值
- $a =& func(); //這樣調(diào)用才是引用傳值
簡而言之,就是讓函數(shù)的返回一個引用類型的值,一個更實際的例子,代碼如下:
- $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函數(shù)傳值的幾個細節(jié),如下:
一、基本數(shù)據(jù)類型的傳值
- /* **************************************************** */
- function testvar($k){
- $k = 40;
- }
- $c = 30;
- //給一個函數(shù)參數(shù)傳一個基本數(shù)據(jù)類型(整型,布爾,字符 ...), 實際上傳的就是值 ;
- testvar($c);
- echo $c;//結(jié)果是:30
- function testvar2(&$k){
- $k = 40;
- }
- $e = 30;
- //給一個函數(shù)參數(shù)傳一個基本數(shù)據(jù)類型(整型,布爾,字符 ...), 實際上傳的y就是地址 ;
- testvar2($e);
- echo $e;//結(jié)果是:40
- /* **************************************************** */
二、數(shù)組(默認情況下是復制一份數(shù)據(jù)),如要傳地址則&$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); //結(jié)果:Array ( [0] => -1 [1] => 0 [2] => 5 )
- }
- testArr($arr1);
- print_r($arr1); //結(jié)果: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); //結(jié)果:Array ( [0] => -1 [1] => 0 [2] => 5 )
- /* **************************************************** */
三、對象數(shù)據(jù)類型傳值
- 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;//結(jié)果是:30 30
- //給一個函數(shù)參數(shù)傳一個對象, 實際上傳的是這個對象的地址;
- function test($k){
- $k->age =40;
- }
- //調(diào)用
- test($b);
- //echo $a->age.$b->age;//結(jié)果是:40 40
- </count>
php函數(shù)的傳值與傳址有什么區(qū)別呢?對于這樣的問題我喜歡通過程序演示來獲取答案,讓我們來看一個演示記錄吧!實例代碼如下:
- <?php
- $i=100;
- function func($n){
- $n=$n+100;
- return $n;
- }
- echo '1)函數(shù)傳值前變量$i的值:'.$i.'<br>';
- echo '2)傳值后函數(shù)的返回值:'.func($i).'<br>';
- echo '3)函數(shù)傳值后變量$i的值:'.$i.'<br>';
- echo '4)函數(shù)傳址前變量$i的值:'.$i.'<br>';
- echo '5)傳址后函數(shù)的返回值:'.func(&$i).'<br>';
- echo '6)函數(shù)傳址后變量$i的值:'.$i.'<br>';
- //echo func($i).'<br>';
- ?>
- /*
- 程序輸出:
- 1)函數(shù)傳值前變量$i的值:100
- 2)傳值后函數(shù)的返回值:200
- 3)函數(shù)傳值后變量$i的值:100
- 4)函數(shù)傳址前變量$i的值:100
- 5)傳址后函數(shù)的返回值:200
- 6)函數(shù)傳址后變量$i的值:200
- */
解釋:
1)直接輸出一個賦值$i=100的變量
2)func函數(shù)傳值返回一個算術(shù)相加的結(jié)果$=100+100
3)func函數(shù)傳值,其作用區(qū)域只限于函數(shù)內(nèi)部,對外面的變量$i不會有影響
4)同上
5)func函數(shù)參數(shù)前多了個"&"符,表示傳址,和2)一樣,返回值是函數(shù)的算術(shù)運行結(jié)果。
6)func(&$i),變量指針指向$i的位置,可以理解為是對變量$i的操作,$i=$i+100;這時變量$i已經(jīng)相當于重新被賦值
如果去掉上面代碼的第18行注釋,會得什么結(jié)果呢?
小結(jié):傳址為了在執(zhí)行函數(shù)的同時,同時改變函數(shù)參數(shù)值,而傳值不期望改變.
新聞熱點
疑難解答