PHP 函數原生只能返回單一值,但透過返回陣列並搭配 list()(或 PHP 7.1+ 的 [] 解構語法),即可實現類似 Python、Go 的多返回值效果,程式碼更清晰易讀。
<?php
function getUserProfile(): array {
return [
'name' => 'Jason',
'email' => 'jason@example.com',
'language' => 'English',
];
}
// PHP 7.1+ 陣列解構語法(推薦)
['name' => $name, 'email' => $email, 'language' => $lang] = getUserProfile();
echo "Name: $name, Email: $email, Language: $lang";
// 舊版 list() 寫法(僅支援數字索引陣列)
// list($name, $email, $language) = array_values(getUserProfile());
?>
<?php
function getCoordinates(): array {
// 計算複雜邏輯...
return ['x' => 100, 'y' => 200, 'z' => 300];
}
// 依鍵名解構,順序不重要,可略過不需要的欄位
['x' => $x, 'z' => $z] = getCoordinates();
echo "X: $x, Z: $z"; // Y 被忽略
?>
['success' => true, 'data' => [...], 'count' => 42]。['valid' => true, 'errors' => [], 'sanitized' => $input]。['path' => '/tmp/abc', 'size' => 1024, 'mime' => 'image/png']。['status' => 200, 'body' => $json, 'headers' => []]。為提升可讀性,建議返回關聯陣列並使用語意化鍵名,配合解構時指定鍵名:
<?php
function divide(int $dividend, int $divisor): array {
if ($divisor === 0) {
return ['success' => false, 'error' => 'Division by zero'];
}
return [
'success' => true,
'quotient' => intdiv($dividend, $divisor),
'remainder' => $dividend % $divisor,
];
}
// 呼叫端
['success' => $ok, 'quotient' => $q, 'remainder' => $r] = divide(10, 3);
if ($ok) {
echo "商: $q, 餘數: $r"; // 商: 3, 餘數: 1
}
?>
對於固定結構的多返回值,定義專用類別更具類型安全與 IDE 支援:
<?php
class DivisionResult {
public function __construct(
public readonly bool $success,
public readonly int $quotient,
public readonly int $remainder,
public readonly ?string $error = null
) {}
}
function divideDto(int $dividend, int $divisor): DivisionResult {
if ($divisor === 0) {
return new DivisionResult(false, 0, 0, 'Division by zero');
}
return new DivisionResult(true, intdiv($dividend, $divisor), $dividend % $divisor);
}
$result = divideDto(10, 3);
if ($result->success) {
echo "商: {$result->quotient}, 餘數: {$result->remainder}";
}
?>
PHP 透過「返回陣列 + 解構賦值」優雅地實現多返回值。簡單場景用陣列解構即可;複雜、固定結構場景建議使用唯讀 DTO 類別(PHP 8.1+ readonly 屬性),兼具型別安全、自動完成與文檔化優勢。