我注意到被接受的答案漏掉了使用简写符号、使用extract存在的安全问题以及IDE问题的示例。
数值类型数组解构(PHP 7.1)
从PHP 7.1开始支持数值类型数组解构(对称数组解构),如下所示:
<?php
$data = [55, 'John', 'UK'];
[$id, $name] = $data;
list($id, $name) = $data;
注意,如果不想要它们,可以省略部分项目。
关联数组解构(PHP 7.1)
您也可以像这样解构关联数组(在列表中支持键):
<?php
$data = ['id' => 55, 'firstName' => 'John', 'country' => 'UK']
['id' => $id, 'firstName' => $name] = $data;
list('id' => $id, 'firstName' => $name) = $data;
请注意,如果您不需要它们,可以跳过项目。另外,变量名可以与属性名不同。
对象解构(PHP 7.1)
不幸的是,没有对象解构。但是,您可以使用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, 'name' => $firstName] = get_object_vars($user)
然而,这可能会破坏一些IDE功能。以下是我在使用PHPStorm 2019.1时注意到的一些问题:
- IDE可能不再理解变量的类型,因此您需要添加一些
@var Type
PHPDocs以保持自动完成功能。
- 与重构工具不兼容。例如,如果您重命名其中一个属性,则数组解构部分也不会自动重命名。
因此,我建议按照正常方式进行操作:
$id = $user->id
$name = $user->firstName
不要使用extract
使用extract,所有变量都会被设置。因此,使用它是一个非常糟糕的主意,因为:
- 它可能会导致安全问题。即使你小心谨慎,它也可能会在未来导致不明显的安全漏洞。如果你确实使用它,请勿与用户输入(例如
$_GET
、$_POST
)一起使用,除非你想让一个恶意黑客开心。
- 可能会导致难以检测的错误
- 如果类或数组在未来发生更改,引入新属性,如果与已使用的变量相符,则可能会破坏您的代码,除非您使用
EXTR_SKIP
标志或类似标志