我创建了这个类,它从数据库中获取帖子的所有数据。
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;
}
}
在这三者之间,哪一个是依赖注入,性能和代码清洁方面的最佳方法?
答案 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);