3

私はOOPの方法でPHPを扱うのは比較的新しいです。私の最新のプロジェクトでは、SQL データベースから多くのエントリをロードし、それらをビューに送信して出力するサイトを作成します。

これを最善の方法で行う方法をいじりながら、以下にリストされているコードを作成しました。

class entryHandler {

//Store database connection
protected $database;

//List of all entries as multidimensional array fetched from SQL.
private $entriesSQL = array();

//List of all entries (as objects) will be stored in our $entries array
private $entriesObjects = array();


/*
 * 
 * Upon construct
 * 
 */
public function __construct($database) {

    //Check if database class has been passed correctly.
    //Else we exit, since we can not function without it!
    if (isset($database)) {

        $this -> database = $database;

        //Get events
        if ($entriesSQL = $this -> getEventsFromSQL()) {
            // Set SQL entries
            $this -> setEntriesSQL($entriesSQL);

            //And turn them into an array of objects
            $this -> setEntryObjects();
        }
        else {

        }
    }
    else {
        echo 'No database connection has been established. Exiting execution.';
        exit();
    }
}


/*
 * Setter for entriesSQL
 */
private function setEntriesSQL($entriesSQL) {
    $this -> entriesSQL = $entriesSQL;
}


/*
 * Getter for entriesSQL
 */
public function getEntriesSQL() {
    return $this -> entriesSQL;
}


/*
 * Setter for entry objects
 * 
 */
private function setEntryObjects() {
    foreach ($this -> getEntriesSQL() as $key => $val) {
        //entryID, entryUserID, entryTitle, entryTimeStart, entryTimeEnd
        array_push($this -> entriesObjects, new entry($val['entryID'], $val['entryUserID'], $val['entryTitle'], $val['entryTimeStart'], $val['entryTimeEnd']));
    }
}


/*
 * 
 * Getter for entry objects
 * 
 */
public function getEntryObjects() {
    return $this -> entriesObjects;
}

/*
 * 
 * This function grabs events from SQL and return multidimensional-array of content.
 * 
 */
private function getEventsFromSQL() {
    //Define the SQL query
    $SQL = '...snippet...';

    if ($entriesSQL = $this -> database -> read($SQL)) {
        //Entries collected, return them.
        return $entriesSQL;
    }
    else {
        //Error occured. Log it and return false.
        return false;
    }
}

}


class entry {

var $entryID;
var $entryUserID;
var $entryTitle;
var $entryTimeStart;
var $entryTimeEnd;

public function __construct($entryID, $entryUserID, $entryTitle, $entryTimeStart, $entryTimeEnd) {
    $this -> setEntryID($entryID);
    $this -> setEntryUserID($entryUserID);
    $this -> setEntryTitle($entryTitle);
    $this -> setEntryTimeStart($entryTimeStart);
    $this -> setEntryTimeEnd($entryTimeEnd);
}

/*
 * Setter for entryID
 */
private function setEntryID($entryID) {
    $this -> entryID = $entryID;
}

/*
 * Getter for entryID
 */
public function getEntryID() {
    return $this -> entryID;
}



/*
 * Setter for entryUserID
 */
private function setEntryUserID($entryUserID) {
    $this -> entryUserID = $entryUserID;
}

/*
 * Getter for entryUserID
 */
public function getEntryUserID() {
    return $this -> entryUserID;
}



/*
 * Setter for entryTitle
 */
private function setEntryTitle($entryTitle) {
    $this -> entryTitle = $entryTitle;
}

/*
 * Getter for entryTitle
 */
public function getEntryTitle() {
    return $this -> entryTitle;
}



/*
 * Setter for entryTimeStart
 */
private function setEntryTimeStart($entryTimeStart) {
    $this -> entryTimeStart = $entryTimeStart;
}

/*
 * Getter for entryTimeStart
 */
public function getEntryTimeStart() {
    return $this -> entryTimeStart;
}


/*
 * Setter for entryTimeEnd
 */
private function setEntryTimeEnd($entryTimeEnd) {
    $this -> entryTimeEnd = $entryTimeEnd;
}

/*
 * Getter for entryTimeEnd
 */
public function getEntryTimeEnd() {
    return $this -> entryTimeEnd;
}
}

これで、クラス「entryHandler」がコントローラーから (別の PHP ファイルに) 次のようにロードされます。

    //Instantiate calenderHandler and pass our database handler to it.
    $entryHandler = new entryHandler($database);

    //Load template
    $template -> calendarEntries = $this -> renderEntries($entryHandler -> getEntryObjects());



/*
 * 
 * This functions renders entries content for view.
 * Returns string with content.
 * 
 */
private function renderEntries($entries) {

    $entriesContent = '';

    foreach ($entries as $entry) {

        $entriesContent .= '{
                                title: "' . $entry -> getEntryTitle() . '",
                                start: "' . $entry -> getEntryTimeStart() . '",
                                end:   "' . $entry -> getEntryTimeEnd() . '"
                            }, ';
    }

    //Right trim entries string, so that we do not add trailing comma to last entry in list.
    $entriesContent = rtrim($entriesContent, ', ');

    //And return content to parse it to view.
    return $entriesContent;
}
 }

これは悪いデザインパターンですか?何か別の方法でやるべきことはありますか? このコードにはある種の冗長性がありますか? - 注意すべきことはありますか?

お時間をいただきありがとうございました。

ごきげんよう、フィッシャー

4

2 に答える 2

3

あなたがしていることは、データを投げかけているようです。これは必ずしも間違っているとは限りませんが、別のことを行うこともできます。すべての SQL エントリを配列に格納する代わりに、次のようにします。

  • データベースからデータをフェッチします。
  • このデータを保持するオブジェクトを作成します。( オブジェクト関係マッピング )

したがって、実際のデータを投げる代わりに、データを含むオブジェクトを投げます。
データの動作方法を変更したり、データを抽出する方法を追加したり、必要なものを追加したりするのは簡単なので、これは良い考えです。

また、あなたがしていることは、必ずしも分類された OOP ではありません。クラスに多くの関数が含まれています。

必要なことを行うクラスを作成し、クラスをできるだけ小さくします。あなたがいるクラスが作成されていない何かをするたびに、必要なものを処理する新しいクラスを作成してください。

OOP の例

OOP を行う方法を学ぶための優れた方法は、他の人がどのように OOP を行ったかを見ることです。他のプロジェクトを調べて、その成果を確認することをお勧めします。

Symfony2 - OOP を使用した複雑な php フレームワーク.
Slim
CodeIgniter
LavarelPHP

于 2012-09-26T09:38:02.610 に答える
0

花王さんの回答にほぼ同意です。とにかく、DBAL を使用する代わりに自分でこれを本当にやりたい場合は、ORMsに関するドキュメントを読むことをお勧めします。

あなたのコードでは、コンストラクトが一度に多くのことを処理できるようにすることは悪い考えです。それらをきれいにして分離します。クラス/メソッド内にオブジェクトを作成する代わりに、依存性注入を使用します。

于 2012-09-26T09:46:42.370 に答える