php7中为对象/关联数组进行解构赋值

在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 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 1

然而只能是数值索引数组,如果是键值关联数组就不行了,限制太多了

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!