2017-08-15 32 views
1

我(想)我明白php的extract()函數的作用。但是,我讀了一些代碼,我看到了這樣的事情:php extract()的用法和用途

extract(['a' => '', 'b' => '', 'c' => 1, 'd' => 0]); 

我的問題:

1:此功能不同於:

$a = ''; $b = ''; $c = 1; $d = 0; 

2:是什麼原因變量聲明/賦值使用extract()?

+1

我不建議使用它,因爲你並不總是能夠控制來自數組的內容(如果它是動態生成的或加載的)。最好使用數組索引(imo)。但是最終,從數組中提取變量與聲明它們幾乎是一樣的,但我沒有理由說你爲什麼要以這種方式聲明它(如果這是唯一目的)。 – Qirel

+2

@ WillParky93,從手冊中:'不要在不可信數據上使用數據提取'。 – Progrock

+2

只是爲了重申上述 - *請*不要在用戶提供的數據上使用'extract'。你基本上只是重新實現了'register_globals',它在15年前被默認禁用,因爲這是一個可怕的想法。 – iainn

回答

1

這是從功能不同...

無兩行代碼是等價的。 extract返回鍵被設置爲變量名稱的值,該值是該變量等於的值,這在每行代碼中描述,使它們在功能上等效。

使用extract()變量聲明/賦值的原因是什麼?

一個合理的用例將使用extract函數返回一個已知鍵值的數組。這樣做可以節省您爲每個存儲值寫入一行聲明的時間。我說已知的密鑰,因爲儘管通過使用array_keysvariable variables可能使用未知密鑰,但通過這樣做,您開始進入可疑編碼技術領域。

extract的文檔中,它聲明「不要在非信任數據上使用extract()」,其中包括可能已被惡意更改的用戶輸入數據。雖然這意味着在$ _POST上使用extract對於公共版本而言是不合適的,但是在測試或個人項目中沒有任何功能錯誤,因爲您可以保證$ _POST的值符合預期。

請記住,有使用extract當一個含糊的水平,如果你的程序在任何時候需要保持在稍後的日期,瞭解什麼一個extract語句返回或發現的變量,從提取出來可能是起源難。 extract在程序中有其用途,但它應該附帶說明它在做什麼的評論,以便將來的參考更清晰。

0

目的。 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; ?> 
+0

使用提取在視圖中很方便,''比' foo?>'或'<?= $ array ['foo']?>'更整潔。我唯一擔心的是,如果你提取沒有引用,你可能會最終複製/加倍你的數據。 – Progrock

+0

請閱讀extract()的文檔。有一些標誌和模式來處理加倍和覆蓋 – volkinc