PHP 函式參數支援**值傳遞** (預設)、**引用傳遞** 及**可變長度參數列表**,理解三者差異對撰寫正確、高效的程式碼至關重要。
<?php
function byValue($val) {
$val = "changed";
}
$original = "original";
byValue($original);
echo $original; // 輸出 "original"
?>
<?php
function byRef(&$val) {
$val = "changed";
}
$original = "original";
byRef($original);
echo $original; // 輸出 "changed"
?>
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);
?>