有用于从数组生成局部变量的提取函数:
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;
}
}
有更简洁的方法吗?
答案 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 "其他程序员"几个月后,可能(而且大部分时间都是)。