在另一个类中使用类的最佳方法

时间:2015-01-28 12:47:13

标签: php class oop dependency-injection traits

我创建了这个类,它从数据库中获取帖子的所有数据。

class Post {
    private $id;
    protected $conn;
    public $data;

    function __construct(\mysqli $conn) {
        $this->conn = $conn;
    }

    public function getId() {
        return $this->id;
    }

    public function getConnection() {
        return $this->conn;
    }

    public function getPost() {
        $query1 = $this->getConnection()->query("SELECT * FROM posts WHERE id=" . $this->id);

        if ($query1->num_rows == 1) {
            $this->data = $query1->fetch_object();
            return $this->data;
        }
    }

    public function setId($id) {
        $this->id = (int)$id;
    }
}

除了帖子,我还需要获取创建帖子的用户的所有数据。我有三种方法可以做到这一点:

1)通过调用Post类中的User类。

    public function getPost() {
        $query1 = $this->getConnection()->query("SELECT * FROM posts WHERE id=" . $this->id);

        if ($query1->num_rows == 1) {
            $this->data = $query1->fetch_object();

            // Initiating User class
            $user = new User($this->getConnection());
            $user->setUserId($this->data->user_id);
            $this->data->user = $user->getUserInfo();

            return $this->data;
        }
    }


2)使用User类扩展Post类。

class Post extends User {
    ....

然后从User类中调用方法

    public function getPost() {
        $query1 = $this->getConnection()->query("SELECT * FROM posts WHERE id=" . $this->id);

        if ($query1->num_rows == 1) {
            $this->data = $query1->fetch_object();

            // Calling methods from the User class
            $this->setUserId($this->data->user_id);
            $this->data->user = $this->getUserInfo();

            return $this->data;
        }
    }


3)通过创建用户特征并在Post类中使用它。

class Post {
    use UserTrait;
    ....

然后从User trait

调用方法
    public function getPost() {
        $query1 = $this->getConnection()->query("SELECT * FROM posts WHERE id=" . $this->id);

        if ($query1->num_rows == 1) {
            $this->data = $query1->fetch_object();

            // Calling methods from the User trait
            $this->setUserId($this->data->user_id);
            $this->data->user = $this->getUserInfo();

            return $this->data;
        }
    }


在这三者之间,哪一个是依赖注入,性能和代码清洁方面的最佳方法?

3 个答案:

答案 0 :(得分:0)

这一切都取决于你将继续做什么。如果你要使用其他类的永久方法,扩展类是更好的交易。如果您只需要另一个类的一部分,那么只需调用该类及其方法。

小心:扩展类表现为单个类。如果你有相同的方法和函数名称,可能会发生很多冲突。

答案 1 :(得分:0)

我认为这取决于代码的其他方面。就个人而言,我只是扩展用户类,因为我不认为在这种特殊情况下使用特征是必要的。

这里有一篇关于在PHP中使用Traits的有用文章 - Using Traits in PHP 5.4

答案 2 :(得分:0)

这个问题可能会被归结为地狱,因为你要求提出意见,但我会投入我的两分钱。

您基本上构建自己的基本ORM。在那个ORM中你处理实体。不同的实体应该由不同的类(模型)处理,底层的数据库表和模型之间应该有1:1的等价。

您的实体之间存在关系。 Yous Post实体的作者应该是User实体的实例。但是,您不会说post表和用户表之间的关系意味着它们可以由相同的Model或父模型的不同风格表示。

如果你使用完整的ORM(Doctrine,Propel,RedbeanPHP),你会发现像Post作者这样的关系意味着在使用像getById()这样的方法时(在你的情况下getPost() })默认情况下,检索到的Post实体将继续实例化每个依赖实体。

在您的情况下,ORM不会让$this->data->user_id为您提供嵌套的$this->data->user对象,因此您不必自行处理。

因此,如果您认为使用ORM的时间过早,那么第一种方法在时机成熟时更容易保留和迁移。

无关的意见

此时,要获取您需要的帖子信息

$post = new Post($conn);
$post->setId($postid);
$postdata = $post->getPost();

如果您更改了构造函数并添加了一个getById()方法,那么

function __construct(\mysqli $conn) {
    $this->conn = $conn;
    return $this;
}

public function getById($id) {
     $this->setId($id);
     return $this->getPost();
}

您可以在一行中检索帖子数据

$postdata=(new Post($conn))->getById($postid);