首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 函式參數傳遞機制:值傳遞、引用傳遞與可變參數完整指南

     編輯:PHP 相關知識

PHP 函式參數支援**值傳遞** (預設)、**引用傳遞** 及**可變長度參數列表**,理解三者差異對撰寫正確、高效的程式碼至關重要。

1. 值傳遞 - 預設行為

  • 實際引數的**副本**傳給形式參數。
  • 函式內修改參數**不影響**外部原變數。
  • 適用於純計算、不需副作用的函式。
<?php
function byValue($val) {
    $val = "changed";
}
$original = "original";
byValue($original);
echo $original; // 輸出 "original"
?>

2. 引用傳遞 - 共享記憶體

  • 定義時在參數前加 `&`:`function (&$param)`。
  • 實參與形參**指向同一記憶體位址** (Zval 容器引用計數 +1)。
  • 函式內修改**直接影響**外部變數。
  • 常用於:需修改外部變數、大型陣列/物件避免複製開銷 (PHP 5+ 物件預設傳遞物件識別符,類引用行為)。
<?php
function byRef(&$val) {
    $val = "changed";
}
$original = "original";
byRef($original);
echo $original; // 輸出 "changed"
?>

3. 可變長度參數列表

PHP 提供三個內建函式配合使用,實現類似 `func(...$args)` 的效果 (PHP 5.6+ 有 `...` 語法糖)。

函式說明
`func_num_args()`回傳呼叫時實際傳入參數個數
`func_get_arg(int $index)`取得指定索引參數值 (0-based)
`func_get_args()`回傳所有參數組成的陣列

範例:彈性求和函式

<?php
function mysum() {
    $num = func_num_args();
    echo "參數個數: $num
"; $sum = 0; for ($i = 0; $i < $num; $i++) { $sum += func_get_arg($i); } echo "總和: $sum
"; } mysum(1, 2, 3, 4); // 參數個數: 4, 總和: 10 ?>

進階應用:彈性建構子

<?php
class MyDB {
    private $host, $user, $pass, $db;

    public function __construct() {
        $args = func_get_args();
        $num = func_num_args();

        if ($num >= 1) $this->host = $args[0];
        if ($num >= 2) $this->user = $args[1];
        if ($num >= 3) $this->pass = $args[2];
        if ($num >= 4) $this->db   = $args[3];

        if ($num > 0) $this->connect();
    }
    private function connect() { /* ... */ }
}

// 多種實例化方式
$db1 = new MyDB('localhost');
$db2 = new MyDB('localhost', 'root');
$db3 = new MyDB('localhost', 'root', 'password', 'mydb');
?>

完整示範:參數檢查與遍歷

<?php
function foo() {
    $num = func_num_args();
    echo "參數數量: $num
"; if ($num >= 2) { echo "第二個參數: " . func_get_arg(1) . "
"; } $args = func_get_args(); foreach ($args as $i => $val) { echo "參數[$i] = $val
"; } } foo(1, 2, 3); ?>

最佳實踐總結

  • 預設用值傳遞:語意清晰、無副作用、易除錯。
  • 需修改外部變數才用引用:如 `sort(&$arr)`、大型資料結構效能優化 (謹慎)。
  • PHP 5.6+ 推薦 `...$args` 語法:`function sum(...$nums) { return array_sum($nums); }` 更清晰、支援型別提示。
  • 避免 `func_*` 系列混用固定參數:易造成維護困擾,除非刻意設計彈性 API。
  • 物件傳遞本質:PHP 5+ 物件變數儲存的是物件識別符,函式傳遞時複製的是識別符,**指向同一物件**,修改物件屬性會影響外部,但重新指派變數 (`$obj = new Other`) 不會影響外部。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved