php7中為物件/關聯陣列進行解構賦值

frans發表於2020-08-27

在CoffeeScript,Clojure,ES6和許多其他語言中,我們對物件/貼圖/等進行了解構,如下所示:

obj = {keyA: 'Hello from A', keyB: 'Hello from B'}
{keyA, keyB} = obj

我在php中找到了這個list函式,可以讓你像這樣構造陣列:

$info = array('coffee', 'brown', 'caffeine');
list($drink, $color, $power) = $info;

對於PHP 7.0及更低版本,超出了功能list。文件說明:
list僅適用於數值陣列,並假設數字索引從0開始。
可能適合您的目的是將extract()變數從陣列匯入當前符號表的函式。
雖然list您可以明確定義變數名稱,extract()但不會給您這種自由。
提取關聯陣列
有了extract你可以做這樣的事情:

<?php
$info = [ 'drink' => 'coffee', 'color' => 'brown', 'power' => 'caffeine' ];
extract($info);
var_dump($drink); // string(6) "coffee"
var_dump($color); // string(5) "brown"
var_dump($power); // string(8) "caffeine"

提取物件
提取物件的工作方式幾乎相同。由於extract只將陣列作為引數,我們需要將物件屬性作為陣列。get_object_vars為你這樣做。它返回一個關聯陣列,其中所有公共屬性都是鍵,其值是值。

<?php
class User {
    public $name = 'Thomas';
}
$user = new User();
extract( get_object_vars($user) );
var_dump($name); // string(6) "Thomas"

陷阱
extract()是不同的,list因為它不允許您顯式定義匯出到符號表的變數名稱。
變數名稱預設對應於陣列鍵。
list是一種語言結構,extract()而是一種功能
可能會覆蓋您事先無意中定義的變數
您的陣列鍵可能無效,因為變數名稱
使用$flags您可以作為第二個引數傳遞的引數,可以extract()在碰撞或無效變數的情況下影響行為。但是知道如何extract()工作並將其與cauton一起使用仍然很重要。

從PHP 7.1開始,這是可能的:

php.net/manual/en/migration71.new-f...

您現在可以在list()或其新的速記[]語法中指定鍵。這使得能夠使用非整數或非順序金鑰對陣列進行解構。

php.net/manual/en/migration71.new-...

現在可以使用簡寫陣列語法([])來解析分配的陣列(包括在foreach中),作為現有list()語法的替代,仍然支援該語法。
它真的不漂亮,幸好這已經在7.1中通過wiki.php.net/rfc/short_list_syntax
如下所示 :

['a' => $a, 'c' => $c] = $args;

laravel 底層獲取controller和action 就使用到上面的解構賦值。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章