我(想)我明白php的extract()函數的作用。但是,我讀了一些代碼,我看到了這樣的事情:php extract()的用法和用途
extract(['a' => '', 'b' => '', 'c' => 1, 'd' => 0]);
我的問題:
1:此功能不同於:
$a = ''; $b = ''; $c = 1; $d = 0;
2:是什麼原因變量聲明/賦值使用extract()?
我(想)我明白php的extract()函數的作用。但是,我讀了一些代碼,我看到了這樣的事情:php extract()的用法和用途
extract(['a' => '', 'b' => '', 'c' => 1, 'd' => 0]);
我的問題:
1:此功能不同於:
$a = ''; $b = ''; $c = 1; $d = 0;
2:是什麼原因變量聲明/賦值使用extract()?
這是從功能不同...
無兩行代碼是等價的。 extract
返回鍵被設置爲變量名稱的值,該值是該變量等於的值,這在每行代碼中描述,使它們在功能上等效。
使用extract()變量聲明/賦值的原因是什麼?
一個合理的用例將使用extract
函數返回一個已知鍵值的數組。這樣做可以節省您爲每個存儲值寫入一行聲明的時間。我說已知的密鑰,因爲儘管通過使用array_keys
和variable variables
可能使用未知密鑰,但通過這樣做,您開始進入可疑編碼技術領域。
在extract
的文檔中,它聲明「不要在非信任數據上使用extract()」,其中包括可能已被惡意更改的用戶輸入數據。雖然這意味着在$ _POST上使用extract
對於公共版本而言是不合適的,但是在測試或個人項目中沒有任何功能錯誤,因爲您可以保證$ _POST的值符合預期。
請記住,有使用extract
當一個含糊的水平,如果你的程序在任何時候需要保持在稍後的日期,瞭解什麼一個extract
語句返回或發現的變量,從提取出來可能是起源難。 extract
在程序中有其用途,但它應該附帶說明它在做什麼的評論,以便將來的參考更清晰。
目的。 1.它可以用作list()的一個版本。但是在extract()的情況下,你不需要關心變量的順序。 另外,從數組中提取的變量屬於特定範圍。 與數據庫使用的情況下,你可以肯定的變種存在
function foo($db){
$hdl = $db->prepare("SELECT * FROM test.first");
$hdl->execute();
$resultArray = $hdl->fetch(PDO::FETCH_ASSOC);
extract($resultArray,EXTR_PREFIX_SAME, "wddx");
echo $id . "<br>";
echo $name . "<br>";
echo $email . "<br>";
}
2.pass可變進視圖,當您使用MVC
//View.php
class View {
function render($filename = null) {
if ($filename !== null) {
$this->filename = $filename;
}
unset($filename);
extract($this->variables);
ob_start();
$this->returned = include($this->dir . $this->filename);
return ob_get_clean();
}
}
//test.php
$view = new View;
$view->filename = 'test.phtml';
$view->dir = './';
$view->variables = array('test' => 'tset');
echo $view->render('test.phtml');
var_dump($view->returned);
//test.phtml
<?php echo $test; ?>
我不建議使用它,因爲你並不總是能夠控制來自數組的內容(如果它是動態生成的或加載的)。最好使用數組索引(imo)。但是最終,從數組中提取變量與聲明它們幾乎是一樣的,但我沒有理由說你爲什麼要以這種方式聲明它(如果這是唯一目的)。 – Qirel
@ WillParky93,從手冊中:'不要在不可信數據上使用數據提取'。 – Progrock
只是爲了重申上述 - *請*不要在用戶提供的數據上使用'extract'。你基本上只是重新實現了'register_globals',它在15年前被默認禁用,因爲這是一個可怕的想法。 – iainn