php函數的傳值與傳址(引用)詳解_PHP教程

來源:互聯網
上載者:User
在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.
/n";
//輸出a: 1, b: 2, c: 1.
//可見對$b的修改不會影響$a
$c = 3;
echo "a: $a, b: $b, c: $c.
/n";
//輸出a: 3, b: 2, c: 3.
//可見對$c的修改會影響$a


php函數傳值的幾個細節

代碼如下 複製代碼
//一、基礎資料型別 (Elementary Data Type)的傳值
/* **************************************************** */
function testvar($k){
$k = 40;
}
$c = 30;
//給一個函數參數傳一個基礎資料型別 (Elementary Data Type)(整型,布爾,字元 ...), 實際上傳的就是值 ;
testvar($c);
echo $c;//結果是:30


function testvar2(&$k){
$k = 40;
}
$e = 30;
//給一個函數參數傳一個基礎資料型別 (Elementary Data Type)(整型,布爾,字元 ...), 實際上傳的y就是地址 ;
testvar2($e);
echo $e;//結果是:40

/* **************************************************** */
//二、數組(預設情況下是複製一份資料),如要傳地址則&$arr.
$arr1 = array(-1,5,0);
function testArr($arr){
for($i=0;$i for($j=$i+1;$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 for($j=$i+1;$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

php函數的傳值與傳址有什麼區別呢?對於這樣的問題我喜歡通過程式示範來擷取答案。讓我們來看一個示範記錄吧!

代碼如下 複製代碼

$i=100;

function func($n){

$n=$n+100;

return $n;

}
echo '1)函數傳值前變數$i的值:'.$i.'
';
echo '2)傳值後函數的傳回值:'.func($i).'
';
echo '3)函數傳值後變數$i的值:'.$i.'
';
echo '4)函數傳址前變數$i的值:'.$i.'
';
echo '5)傳址後函數的傳回值:'.func(&$i).'
';
echo '6)函數傳址後變數$i的值:'.$i.'
';
//echo func($i).'
';
?>

程式輸出:

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行注釋,會得什麼結果呢?

小結:傳址為了在執行函數的同時,同時改變函數參數值,而傳值不期望改變。

http://www.bkjia.com/PHPjc/632691.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/632691.htmlTechArticle在php中我們函數傳值就比較簡單了,但可能有些朋友地天真無邪函數傳址或引用搞不明白,下面小編來給各位介紹在php中函數傳值與傳址(引...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.