我在示例中创建了两个类。这些类分别表示{Author}和{BlogPost}。我知道如何从这些类中获取信息和向这些类中写入信息。我的问题是关于处理数据库中的信息。
属性必须从数据库类中获取数据吗?问题是我不知道如何用数据库中的数据填充类。与数据库的连接不是问题所在。这一切都是关于我如何用数据库中的数据填充类。
<?php
class Author{
private $naam;
private $biografie;
private $avatar;
public function getNaam() {
print($this->naam);
}
public function getBiografie() {
print($this->biografie);
}
public function getAvatar() {
print($this->avatar);
}
public function setNaam($naam) {
$this->naam = $naam;
}
public function setBiografie($biografie) {
$this->biografie = $biografie;
}
public function setAvatar($avatar) {
$this->avatar = $avatar;
}
}
class BlogPost{
private $titel;
private $content;
private $author;
public function __construct() {
$this->author = new Author;
}
public function getTitel() {
print($this->titel);
}
public function getContent() {
print($this->content);
}
public function getAuthor() {
print($this->author->getNaam());
}
public function setTitel($titel) {
$this->titel = $titel;
}
public function setContent($content) {
$this->content = $content;
}
}
?>
我知道如何通过编写查询从数据库中获取数据,但我不知道如何处理类中的数据。
我必须将我的属性链接到数据库吗?
private $naam = Database::getName();
或者我需要在get或set方法中编写一个查询吗?
有很多不同的方法可以做到这一点。阅读有关ActiveRecord或Repository模式的信息。就个人而言,我更喜欢将持久性问题排除在业务层之外,所以我倾向于Repository模式。
存储库通常由您选择的ORM支持,但其中一个仍然可以用纯SQL实现。但是,请记住,如果在没有工具的情况下进行保存,则在保存对象时,必须执行自己的脏检查,以确定对象的哪些部分发生了更改。
存储库的伪代码:
public class AuthorSqlRepository implements AuthorRepository {
private QueryService queryService;
public AuthorSqlRepository(QueryService queryService) {
this.queryService = queryService;
}
public void save(Author author) {}
public Author findById(String authorId) {
resultset = queryService.executeQuery('SELECT id, naam, bio, avatar FROM Author WHERE ...');
author = new Author();
//In languages that supports it, reflection can be used
//to set private class members directly so that you do not need
//public setters.
author.setId(resultset.id);
...
return author;
}
}
然后你可以做:
authorRepository = new AuthorSqlRepository(queryService);
author = authorRepository.findById(someAuthorId);
naam = author.getNaam();
private naam = Database::getName();
你可以用Java做这样的事情,但不能用PHP。如果这样做,PHP将抛出一个致命错误,指示无效语法。
只能通过函数调用的结果填充类属性,只能从类方法内部填充。例如:
class Author
{
public $name;
public function load()
{
$this->name = DB::getName();
}
}
$author = new Author();
$author->load();
echo $author->name;
此外,作为一种最佳实践,你应该始终只用英语命名你的方法和类。
首先,您需要构建适合您需求的正确sql表,我认为您已经这样做了。在这种情况下,您可能至少有两个表:blogPosts&authors,其中blogPosts.author曾经通过其id加入作者。
第二步,您需要从DB请求所需的数据,通过这些表之间的INNER JOIN,它可以用多种方式编写。例如,如果你使用PDO,你可以这样做:
$db = new PDO("mysql:host=your_host;dbname=your_db_name","your_user_name", "your_password");
$query=$db->query("SELECT a.naam, a.biografie, a.avatar, bp.title, bp.content, bp.author
FROM authors AS a, blogposts AS bp
WHERE a.id=bp.author");//Executes an SQL statement, returning a result set as a PDOStatement object
第三,您需要使用其中一种获取方法来获取数据,例如fetch(PDO::fetch_ASSOC(PDO fetch方法它将接收到的数据转换为php关联数组,也称为Dictionary(Swift、Python等(,并像这样迭代:
while($r=$query->fetch(PDO::FETCH_ASSOC)){
//$r["naam"] for author's naam column
//$r["title"] for blogPosts's title
$bPost=new BlogPost();
$bPost->setTitle($r["title"]);
//...
}
正如@DavidY之前提到的,类型、方法、属性等的所有名称。。应该是用英语写的,应该是有意义的,而且,注意在BlogPost课堂上你写的是titel而不是title。这些小东西以后会引起大错误。
哦,还有一件事,由于对象有直接连接(紧密耦合(,我建议删除公共setter,而不是从构造函数的参数初始化。像这样:
class BlogPost{
private $title;
private $content;
private $author;
public function __construct($title,$content,$author){
$this->title=$title;
$this->content=$content;
$this->author=$author;
}
}
class Author{
private $naam;
private $biografie;
private $avatar;
public function __construct($naam,$biografie,$avatar){
$this->naam=$naam;
$this->biografie=$biografie;
$this->avatar=$avatar;
}
}
然后你的环体就变成了一个单线
while($r=$query->fetch(PDO::FETCH_ASSOC)){
$bPost=new BlogPost($r["title"],$r["content"],new Author($r["naam"],$r["biografie"],$r["avatar"]));
}
要从我的数据库中获取数据,请编写sql查询,然后使用mysql_query或PDO,因为您知道如何建立连接