php 函数传值_传址_函数参数,php函数的传值与传址(引用)详解_PHP教程
在php中我們函數(shù)傳值就比較簡(jiǎn)單了,但可能有些朋友地天真無邪函數(shù)傳址或引用搞不明白,下面小編來給各位介紹在php中函數(shù)傳值與傳址(引用)介紹,希望對(duì)各位有所幫助。
php中引用的用法:
1. 變量的引用賦值: $a = &$b
2. 函數(shù)調(diào)用時(shí)的引用參數(shù)傳遞
1) 早期php是在調(diào)用時(shí)通過&符號(hào)傳遞引用類型的變量, 比如: func(&$arg);
2) 后來, 函數(shù)的引用類型參數(shù)被規(guī)定為需要在函數(shù)聲明時(shí)定義, 不如: function func(&$arg);
注: 引用聲明時(shí)定義引用類型參數(shù)后, 運(yùn)行時(shí)引用參數(shù)傳遞被廢棄, 需要在php.ini中增加allow_call_time_pass_reference來開啟.
3. 函數(shù)返回引用類型, 這種應(yīng)用方式需要聲明函數(shù)時(shí), 在函數(shù)名前增加&符號(hào), 并且, 在調(diào)用時(shí), 要用引用賦值方式, 比如:
代碼如下
復(fù)制代碼
function &func() {
return $a;
}
$a = func(); //這種調(diào)用方式得到的不是引用傳值
$a =& func(); //這樣調(diào)用才是引用傳值
簡(jiǎn)而言之, 就是讓函數(shù)的返回一個(gè)引用類型的值, 一個(gè)更實(shí)際的例子:
代碼如下
復(fù)制代碼
$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.
//可見對(duì)$b的修改不會(huì)影響$a
$c = 3;
echo “a: $a, b: $b, c: $c.
/n”;
//輸出a: 3, b: 2, c: 3.
//可見對(duì)$c的修改會(huì)影響$a
php函數(shù)傳值的幾個(gè)細(xì)節(jié)
代碼如下
復(fù)制代碼
//一、基本數(shù)據(jù)類型的傳值
/* **************************************************** */
function testvar($k){
$k = 40;
}
$c = 30;
//給一個(gè)函數(shù)參數(shù)傳一個(gè)基本數(shù)據(jù)類型(整型,布爾,字符 …), 實(shí)際上傳的就是值 ;
testvar($c);
echo $c;//結(jié)果是:30
function testvar2(&$k){
$k = 40;
}
$e = 30;
//給一個(gè)函數(shù)參數(shù)傳一個(gè)基本數(shù)據(jù)類型(整型,布爾,字符 …), 實(shí)際上傳的y就是地址 ;
testvar2($e);
echo $e;//結(jié)果是:40
/* **************************************************** */
//二、數(shù)組(默認(rèn)情況下是復(fù)制一份數(shù)據(jù)),如要傳地址則&$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); //結(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
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); //結(jié)果:Array ( [0] => -1 [1] => 0 [2] => 5 )
/* **************************************************** */
//三、對(duì)象數(shù)據(jù)類型傳值
class person{
public $name;
public $age;
}
$a = new person();
$a->name = ‘小明’;
$a->age = ’20’;
//變量a在存的是對(duì)象的地址,把a(bǔ)賦給b這個(gè)變量,實(shí)際上就是賦了一個(gè)地址。
$b = $a;
$b->age = 30;
//echo $a->age.$b->age;//結(jié)果是:30 30
//給一個(gè)函數(shù)參數(shù)傳一個(gè)對(duì)象, 實(shí)際上傳的是這個(gè)對(duì)象的地址;
function test($k){
$k->age =40;
}
//調(diào)用
test($b);
//echo $a->age.$b->age;//結(jié)果是:40 40
php函數(shù)的傳值與傳址有什么區(qū)別呢?對(duì)于這樣的問題我喜歡通過程序演示來獲取答案。讓我們來看一個(gè)演示記錄吧!
代碼如下
復(fù)制代碼
$i=100;
function func($n){
$n=$n+100;
return $n;
}
echo ‘1)函數(shù)傳值前變量$i的值:’.$i.’
‘;
echo ‘2)傳值后函數(shù)的返回值:’.func($i).’
‘;
echo ‘3)函數(shù)傳值后變量$i的值:’.$i.’
‘;
echo ‘4)函數(shù)傳址前變量$i的值:’.$i.’
‘;
echo ‘5)傳址后函數(shù)的返回值:’.func(&$i).’
‘;
echo ‘6)函數(shù)傳址后變量$i的值:’.$i.’
‘;
//echo func($i).’
‘;
?>
程序輸出:
1)函數(shù)傳值前變量$i的值:100
2)傳值后函數(shù)的返回值:200
3)函數(shù)傳值后變量$i的值:100
4)函數(shù)傳址前變量$i的值:100
5)傳址后函數(shù)的返回值:200
6)函數(shù)傳址后變量$i的值:200
解釋:
1)直接輸出一個(gè)賦值$i=100的變量
2)func函數(shù)傳值返回一個(gè)算術(shù)相加的結(jié)果$=100+100
3)func函數(shù)傳值,其作用區(qū)域只限于函數(shù)內(nèi)部,對(duì)外面的變量$i不會(huì)有影響
4)同上
5)func函數(shù)參數(shù)前多了個(gè)”&”符,表示傳址,和2)一樣,返回值是函數(shù)的算術(shù)運(yùn)行結(jié)果。
6)func(&$i),變量指針指向$i的位置,可以理解為是對(duì)變量$i的操作,$i=$i+100;這時(shí)變量$i已經(jīng)相當(dāng)于重新被賦值
如果去掉上面代碼的第18行注釋,會(huì)得什么結(jié)果呢?
小結(jié):傳址為了在執(zhí)行函數(shù)的同時(shí),同時(shí)改變函數(shù)參數(shù)值,而傳值不期望改變。
www.bkjia.comtrueTechArticle在php中我們函數(shù)傳值就比較簡(jiǎn)單了,但可能有些朋友地天真無邪函數(shù)傳址或引用搞不明白,下面小編來給各位介紹在php中函數(shù)傳值與傳址(引…
總結(jié)
以上是生活随笔為你收集整理的php 函数传值_传址_函数参数,php函数的传值与传址(引用)详解_PHP教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 雄安新区铂悦府是哪个开发商?
- 下一篇: 动态规划算法php,php算法学习之动态