我在我的例子中创建了两个类。这些类分别代表 {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方法中编写查询吗?
答案 0 :(得分:1)
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;
此外,作为最佳做法,您应始终仅使用英语为您的方法和课程命名。
答案 1 :(得分:1)
有很多不同的方法可以做到这一点。阅读有关ActiveRecord或存储库模式的信息。 Personnaly,我更喜欢将持久性问题留在业务层之外,所以我倾向于存储库模式。
存储库通常由您选择的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();
答案 2 :(得分:1)
首先,您需要构建适合您需求的正确sql表,我假设您已经这样做了。 在这种情况下,您可能至少有2个表:blogPosts&amp;作者,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 method 它将收到的数据转换为php关联数组a.k.a 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"]));
}
答案 3 :(得分:0)
要从我的数据库中获取数据,请编写sql查询,然后使用mysql_query或PDO,因为您知道如何建立连接