0

我目前正在编写一个 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
}
}

?>
4

1 回答 1

0

创建一个名为 loadUser 的方法(或您喜欢的名称),如果传递给构造函数的数据数组有 ID,则使用 loadUser 方法加载详细信息。如果没有,您可以插入一个用户。在此之后,您可以继续编辑用户。

于 2013-10-01T18:26:39.243 回答