在PHP的函數中,參數傳遞可以分為值傳遞和引用傳遞(也稱為地址傳遞)兩種。
默認情況下,PHP是按值傳遞參數的。值傳遞參數調用函數時將常量或變量的值(通常稱其為實參)傳遞給函數的參數(通常稱為形參)。值傳遞的特點是實參與行參分別存儲在內存中,是兩個不相關的獨立變量。因此,在函數內部改變形參的值時,實參的值一般是不會改變的。
引用傳遞(按地址傳遞)的特點是實參與行參共享一塊內存。因此,當形參的值改變的時候,實參的值也會相應的做出改變。從這種角度上說,可以認為形參合實參是同一個變量。
定義引用傳遞參數時,可以在參數前面加上引用符號&。
<?php function printString(&$string){ echo($string); $string="打印完成"; } $str="測試字符!n"; printString($str); echo($str); ?> // 程序輸出:測試字符! 打印完成
php還支持可變長度的參數列表。在定義函數時,不指定參數。在調用函數時,可以根據需要指定參數的數量,通過與參數相關的幾個系統函數獲取參數信息。具體說明為:
<?php function mysum() { $num = func_num_args(); echo("函數包含:".$num."個參數n"); $sum = 0; for($i=0; $i < $num; $i++) { $sum = $sum + func_get_arg($i); } echo("參數累加紙盒為:".$sum); } mysum(1,2,3,4); ?> // 程序輸出:函數包含:4個參數 參數累加紙盒為:10
func_num_args函數功能:返回傳遞到函數的參數數目,其語法如下 : int func_num_args (void )。說明 : 返回傳遞到目前定義函數的參數數目。如果是從函數定義的外面來呼叫此函數,則func_get_arg( )將會產生警告。
func_num_args( )可以用來結合func_get_arg( )和func_get_args( )來允許使用者定義的函式接受variable-length參數列表。其中,func_get_arg( )從參數列表返回項目,其語法:int func_get_arg (int arg_num),傳回定義函數的參數列表的第arg_num個參數,其參數從0開始。且函數定義的外面來呼叫此函數會產生警告;並且當arg_num大於函數實際傳遞的參數數目時亦會產生警告並返回FALSE。
func_get_args()函數和func_get_arg()函數的區別在於,func_get_args()函數傳回一數組,數組的各個元素相當於是目前使用者定義函式的參數列的數目。
在我們構建PHP類的時候,靈活使用這三個函數,可以起到非常理想的效果,例如外面在創建PHP和MYSQL鏈接的類時,可以書寫如下代碼:
<?php class mydb { private $user; private $pass; private $host; private $db; public function __construct(){ $num_args=func_num_args(); if($num_args>0){ $args=func_get_args(); $this->host=$args[0]; $this->user=$args[1]; $this->pass=$args[2]; $this->connect(); } } } ?>
再給出一個示例程序:
<?php function foo() { $numargs = func_num_args(); echo "Number of arguments: $numargs<br>n"; if ($numargs >= 2) { echo "Second argument is: " . func_get_arg (1) . "<br>n"; } $arg_list = func_get_args(); for ($i = 0; $i < $numargs; $i++) { echo "Argument $i is: " . $arg_list[$i] . "<br>n"; } } foo (1, 2, 3); ?>