extract(array $array, int $flags = EXTR_OVERWRITE, string $prefix = ''): int
<?php
$vars = ['var1'=>'1', 'var2'=>'2', 'var3'=>'3'];
extract($vars);
echo $var1; // 1
echo $var2; // 2
?>
| 常數 | 行為 |
|---|---|
EXTR_OVERWRITE | 預設。衝突時覆蓋既有變數。 |
EXTR_SKIP | 衝突時跳過,保留既有變數。 |
EXTR_PREFIX_SAME | 衝突時加前綴 $prefix(需提供)。 |
EXTR_PREFIX_ALL | 所有變數加前綴 $prefix。 |
EXTR_PREFIX_INVALID | 僅非法/數字鍵名加前綴。 |
EXTR_IF_EXISTS | 僅覆蓋已存在的同名變數。 |
EXTR_PREFIX_IF_EXISTS | 僅為已存在的同名變數建立帶前綴的新變數。 |
EXTR_REFS | 以參考方式匯入(變更會影響原陣列)。 |
<?php
$a = 'Original';
$arr = ['a'=>'Cat', 'b'=>'Dog'];
extract($arr, EXTR_PREFIX_SAME, 'dup');
echo $a; // Original(未被覆蓋)
echo $dup_a; // Cat(衝突加前綴)
echo $b; // Dog
?>
$_REQUEST),覆蓋關鍵變數($is_admin、$db_config)。<?php
// 方案一:foreach 明確指派(可控制範圍)
foreach ($vars as $k => $v) {
$$k = $v; // 變數變數,仍有風險但可加前綴
}
// 方案二:直接使用陣列存取(最清晰、安全)
$var1 = $vars['var1'] ?? null;
// 方案三:解構賦值(PHP 7.1+)
['var1' => $var1, 'var2' => $var2] = $vars;
?>
結論:現代 PHP 開發強烈不建議使用 extract(),改用明確的陣列存取或解構賦值。