我注意到接受的答案遗漏了使用速记符号的示例,使用提取的安全问题以及IDE问题。
数值数组解构 (PHP 7.1)
从 PHP 7.1 开始,支持数值数组解构(Symetric array destructuring),如下所示:
<?php
$data = [55, 'John', 'UK'];
[$id, $name] = $data; // short-hand (recommended)
list($id, $name) = $data; // long-hand
请注意,如果您不想要它们,您可能会错过它们。
关联数组解构 (PHP 7.1)
您还可以取消组织关联数组(支持列表中的键),如下所示:
<?php
$data = ['id' => 55, 'firstName' => 'John', 'country' => 'UK']
['id' => $id, 'firstName' => $name] = $data; // short-hand (recommended)
list('id' => $id, 'firstName' => $name) = $data; // long-hand
请注意,如果您不想要它们,您可能会错过它们。此外,变量名称也可以与属性名称不同。
对象解构 (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, 'firstName' => $name] = get_object_vars($user)
但是,这可能会破坏某些 IDE 功能。这些是我在使用PHPStorm 2019.1时注意到的一些问题:
- IDE 可能不再理解变量的类型,因此您需要添加一些 PHPDocs 来维护自动完成功能
@var Type
- 不能很好地与重构工具配合使用。例如,如果重命名其中一个属性,则数组解构部分也不会自动重命名。
所以我建议以正常的方式去做:
$id = $user->id
$name = $user->firstName
请勿使用extract
使用提取时,始终设置所有变量。在那里,使用它是一个非常糟糕的主意,因为:
- 它可能导致安全问题。即使你小心翼翼,将来也可能导致不明显的安全漏洞。如果您确实使用它,请不要将其与用户输入(例如,)一起使用,除非您想制造恶意黑客的一天。
$_GET
$_POST
- 可能导致难以检测的错误
- 如果类或数组将来发生更改,则通过引入新属性,如果它与已使用的变量重合,则可能会破坏代码,除非您使用标志或类似
EXTR_SKIP