类成员的extract()

时间:2016-06-29 15:53:44

标签: php arrays

有用于从数组生成局部变量的提取函数:

extract(['a' => 10, 'b' => 20]) // $a = 10, $b = 20

extract()函数这样的干净解决方案是什么,但对于类成员?显然,我可以按照以下方式做点什么:

class User {
  private $user_id;
  private $password;
  private $email;

  public function __construct($params) {
    $this->user_id = isset($params['user_id']) ? $params['user_id'] : null;
    $this->password = isset($params['password']) ? $params['password'] : null;
    $this->email = isset($params['email']) ? $params['email'] : null;
  }
}

有更简洁的方法吗?

2 个答案:

答案 0 :(得分:5)

一个行为类似于extract()的简单解决方案:

foreach($params as $key => $val) {
    $this->$key = $val;
}

答案 1 :(得分:1)

最干净的方法是完全避免数组和extract()并传递构造函数的各个参数:

public function __construct($user_id, $password, $email)
{
    // Add validation and default values for each member as needed
    $this->user_id  = $user_id;
    $this->password = $password;
    $this->email    = $email;
}

这样,读取代码的另一个程序员 1 一眼就能理解构造函数所期望的参数以及它们的含义。

它还使得使用该类的代码更加清晰。比较:

$user = new User($id, $_POST['password'], $_POST['email']);

使用:

$user = new User($_POST);

在第一种情况下,您不必阅读类User的代码,以了解它失败或产生意外结果的原因。快速查看$_POST的内容就足以知道传递给User::__construct()的值是否是它所期望的值。

1 "其他程序员"几个月后,可能(而且大部分时间都是)。