我目前正在编写一个 PHP 脚本,但我不确定以下最佳实践是什么:
由于 PHP 不允许在一个类(用户)中有多个构造函数,我有一个构造函数,它有一个数组作为参数(对于 id、name、address,请参见下面的代码块)。
当这个数组不包含id,但包含其他属性(如姓名、地址)时,它会调用类的insert方法,并将插入行的id赋给类的id属性。当一个包含 id、name 和 address 的数组被传递给构造函数时,它会将这些值分配给相应的属性。
当我想在数据库中编辑用户时,可以通过以下方式实现:
向构造函数添加一个选项,只传递数组中的 id(没有名称和地址属性,因为在调用 update 方法时这些是不知道的),而不是在这个实例上调用 update 方法。这样做的一个问题是,您有一个不能很好地表示真实对象的实例(如在数据库中)。例如,您不能调用 getName() 方法,因为 name 未设置。
与上面相同,但现在当只有 id 传递给构造函数时,从数据库中加载其他属性,以便实例是数据库中对象的正确表示。然后
可以在这个实例上调用更新方法。将更新方法设为静态,这样我就可以在
不创建实例的情况下调用更新方法
前两点的问题是,我在构造函数中得到了一种意大利面条代码,因为我必须检查哪些属性被传递给构造函数中的数组。
您认为我可以选择哪种解决方案最好?
您是否有更好的方法不会导致构造函数中出现大量意大利面条代码?
<?php
class User
{
private $id;
private $name;
private $address;
public function __construct($data)
{
$this->name = $data['name'];
$this->address = $data['address'];
if (isset($data['id'])) {
$this->id = $data['id'];
} else {
$result = $this->insert();
$this->id = $wpdb->insert_id; //Wordpress method for retrieving insert id
}
}
public function get_id() { return $this->id; }
public function get_name() { return $this->name; }
public function get_address() { return $this->address; }
public function insert() { //insert into DB }
public function update($data) { //update in DB the $data attributes}
public function delete() { //delete from database }
public static function get_user_list()
{
// load users from the database
// foreach user {
// create User instance by passing the id, name and address values from the database in an array to the constructor of User
// add user instance to a result array
// }
// return result array
}
}
?>