我对我正在创建的 OOP PHP 代码有几个疑问。它(到目前为止)用于检索在线存储的不同语言的标题和多个章节。但首先我将展示代码,因为我的疑问涉及到这一点。这是我目前正在使用的课程:
<?php
// Requires PHP 5.4+
class Subject
{
private $DB;
private $Language;
private $Keyword;
public function __construct($DB, $Keyword, $Language)
{
$this->DB=$DB;
$this->Keyword=$Keyword;
$this->Language=$Language;
}
private function query($query, $arg)
{
$STH = $this->DB->prepare($query);
$STH->execute(array_merge((array)$this->Keyword, (array)$arg));
return $STH->fetch()[$this->Language]; // PHP 5.4+
}
public function retrieveTitle ()
{
return $this->query("SELECT * FROM subject WHERE keyword = ? ORDER BY date DESC LIMIT 1");
}
public function retrieveChapter ($arg)
{
return $this->query("SELECT * FROM chapters WHERE subject_keyword = ? AND type = ? ORDER BY date DESC LIMIT 1", $arg);
}
?>
然后我做类似的事情来显示页面:
if (isset($_GET['a']))
{
$Subject=new Subject($DB, $_GET['a'], $User->get('language'));
if ($Subject->retrieveTitle())
{
echo '<h1 id="Title">'.$Subject->retrieveTitle().'</h1>';
// Index
if ($Subject->retrieveTitle())
// ... code for the index
// Introduction
if ($Subject->retrieveChapter('Introduction'))
echo '<h2 id="Introduction">' . $_('Introduction') . '</h2>' . $Subject->retrieveChapter('Introduction');
// ... more non-relevant code.
}
}
else
// ... whatever
第一关心。我不确定这是否是处理此类数据的正确方法。我试图将这些方法分开并使它们尽可能小,也尽量不重复太多代码。这是感觉正确的方式。但我不明白为什么这个与前一个类似的其他代码不太受欢迎。注意:这个类肯定有一些错别字并且没有经过测试,这里只是为了说明区别,所以请不要使用它(至少不是字面意思):
<?php
// Requires PHP 5.4+
class Subject
{
public $Title;
public $Chapters = array ();
public function __construct($DB, $Keyword, $Language)
{
// Retrieve all
$STH = $DB->prepare("SELECT * FROM subject WHERE keyword = ? ORDER BY date DESC LIMIT 1");
$STH->execute(array($Keyword));
$this->Title = $STH->fetch()[$Language]; // PHP 5.4+
// Retrieve chapters
$ToForeach = ('Introduction','History','1');
$STH = $DB->prepare("SELECT * FROM chapters WHERE subject_keyword = ? AND type = ? ORDER BY date DESC LIMIT 1");
foreach ($ToForeach as $part)
{
$STH->execute(array($Keyword, $part));
$this->Chapters = $STH->fetch()[$Language];
}
}
}
?>
然后直接访问属性(或者甚至在中间构建一些 get() ,但你明白了)。
那么,有什么区别吗?第一种方法与第二种编码类的方法有什么好处和缺陷?第一个中的内存使用量应该稍微小一些,但我认为与这种情况下的可读性相比,这不会是一个交易破坏者。
编辑:只是以一种让别人理解的方式写下这个问题已经让我以其他方式思考它。第一种方法看起来也更容易测试。
第二个担心。如果我想创建一个/一些方法来保存数据,我应该把它放在同一个类还是不同的类?因为如果我把它放在一个中,它会将所有与主题相关的方法捆绑在一个非常独立的类中,如果我将它分开,我会有更多具有分离角色的专业类。
也欢迎任何进一步的建议,特别是关于编码最佳实践 [我可能没有遵循] 的建议!