私が作成している 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() を作成することもできますが、アイデアは得られます)。
違いはありますか?クラスをコーディングする最初の方法と 2 番目の方法の利点と落とし穴は何ですか? メモリ使用量は最初のものの方がわずかに小さいはずですが、この場合の読みやすさと比較して、それは大きな問題にはならないと思います。
編集:他の人が理解できるように質問を書くだけで、他の方法でそれについて考えるようになりました. 最初の方法は、テストも簡単に見えます。
2番目の懸念。データを保存するためのメソッドを作成したい場合、同じクラスまたは別のクラスに配置する必要がありますか? それを 1 つにすると、サブジェクトに関連するすべてのメソッドが 1 つのかなり独立したクラスにバンドルされるため、それを分離すると、役割が分離された、より特殊化されたクラスになります。
特にコーディングのベスト プラクティスに関するその他のアドバイスも歓迎します。