Cot*_*ten 23 php destructuring
在CoffeeScript,Clojure,ES6和许多其他语言中,我们对对象/贴图/等进行了解构,如下所示:
obj = {keyA: 'Hello from A', keyB: 'Hello from B'}
{keyA, keyB} = obj
Run Code Online (Sandbox Code Playgroud)
我在php中找到了这个list函数,它允许你像这样构造数组:
$info = array('coffee', 'brown', 'caffeine');
list($drink, $color, $power) = $info;
Run Code Online (Sandbox Code Playgroud)
有没有办法在PHP中解构对象或关联数组?如果不在核心库中,也许有人写了一些智能助手功能?
thp*_*hpl 34
对于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"
Run Code Online (Sandbox Code Playgroud)
提取对象
提取对象的工作方式几乎相同.由于extract只将数组作为参数,我们需要将对象属性作为数组.get_object_vars为你这样做.它返回一个关联数组,其中所有公共属性都是键,其值是值.
<?php
class User {
public $name = 'Thomas';
}
$user = new User();
extract( get_object_vars($user) );
var_dump($name); // string(6) "Thomas"
Run Code Online (Sandbox Code Playgroud)
陷阱
extract()是不同的,list因为它不允许您显式定义导出到符号表的变量名称.变量名称默认对应于数组键.
list是一种语言结构,extract()而是一种功能使用$flags您可以作为第二个参数传递的参数,可以extract()在碰撞或无效变量的情况下影响行为.但是知道如何extract()工作并将其与cauton一起使用仍然很重要.
您现在可以在list()或其新的速记[]语法中指定键.这使得能够使用非整数或非顺序密钥对数组进行解构.- http://php.net/manual/en/migration71.new-features.php#migration71.new-features.symmetric-array-destructuring
现在可以使用简写数组语法([])来解析分配的数组(包括在foreach中),作为现有list()语法的替代,仍然支持该语法.- http://php.net/manual/en/migration71.new-features.php#migration71.new-features.support-for-keys-in-list
例如:
$test_arr = ['a' => 1, 'b' => 2];
list('a' => $a, 'b' => $b) = $test_arr;
var_dump($a);
var_dump($b);
Run Code Online (Sandbox Code Playgroud)
从7.1.0开始输出以下内容
int(1)
int(2)
Run Code Online (Sandbox Code Playgroud)
Yah*_*din 33
我注意到接受的答案遗漏了使用简写符号的示例、使用提取的安全问题和 IDE 问题。
从 PHP 7.1 开始,数值数组解构(Symetric array destructuring)支持如下:
<?php
$data = [55, 'John', 'UK'];
[$id, $name] = $data; // short-hand (recommended)
list($id, $name) = $data; // long-hand
Run Code Online (Sandbox Code Playgroud)
请注意,如果您不想要它们,您可能会错过它们。
您还可以像这样解构关联数组(支持列表中的键):
<?php
$data = ['id' => 55, 'firstName' => 'John', 'country' => 'UK']
['id' => $id, 'firstName' => $name] = $data; // short-hand (recommended)
list('id' => $id, 'firstName' => $name) = $data; // long-hand
Run Code Online (Sandbox Code Playgroud)
请注意,如果您不想要它们,您可能会错过它们。此外,变量名称可以与属性名称不同。
不幸的是,没有对象解构。但是,您可以使用 将对象转换为关联数组get_object_vars,然后使用关联数组解构。
<?php
class User {
public $id;
public $name;
public $country;
}
$user = new User();
$user->id = 55;
$user->name = 'John';
$user->country = 'UK';
['id' => $id, 'firstName' => $name] = get_object_vars($user)
Run Code Online (Sandbox Code Playgroud)
但是,这可能会破坏某些 IDE 功能。这些是我在使用 PHPStorm 2019.1 时注意到的一些问题:
@var TypePHPDoc 以维护自动完成功能因此,我建议您按照正常方式进行操作:
$id = $user->id
$name = $user->firstName
Run Code Online (Sandbox Code Playgroud)
extract使用提取,所有变量总是被设置。使用它是一个非常糟糕的主意,因为:
$_GET, $_POST)一起使用,除非您想成为恶意黑客的一天。EXTR_SKIP标志或类似的| 归档时间: |
|
| 查看次数: |
10438 次 |
| 最近记录: |