0

CodeIgniter を使用して、ユーザーがさまざまな基準 (たとえば、著者、タイトル、発行者など) に基づいて検索できるライブラリ検索エンジンを作成しています。BookSearchそこで、データベースの検索を担当するすべてのクラスが実装するインターフェースを定義しました

interface BookSearch{
/**
Returns all the books based on a given criteria as a query result.
*/
public function search($search_query);
}

著者に基づいて検索を実装したい場合は、彼のクラスAuthorSearchを次のように書くことができます

class AuthorSearch implements BookSearch extends CI_Model{

function __construct(){
    parent::__construct();
}

public function search($authorname){
    //Implement search function here...
    //Return query result which we can display via foreach
}
}

次に、これらのクラスを利用して結果を表示するコントローラーを定義します。

class Search extends CI_Controller{

/**
These constants will contain the class names of the models
which will carry out the search. Pass as $search_method.
*/
const AUTHOR = "AuthorSearch";
const TITLE = "TitleSearch";
const PUBLISHER = "PublisherSearch";

public function display($search_method, $search_query){
    $this->load->model($search_method);
}
}

これが私の問題にぶつかったところです。CodeIgniter のマニュアルには、モデル (つまりsearch) でメソッドを呼び出すには、 と書くと書かれてい$this->AuthorSearch->search($search_query)ます。しかし、検索クラスのクラス名を文字列として持っているので、本当にうまくできません$this->$search_method->search($search_query)か?

これが Java の場合は、定数にオブジェクトをロードします。PHP5 には型ヒントがあることは承知していますが、このプロジェクトのターゲット プラットフォームには PHP4 があります。また、この抽象化を行うためのより「CodeIgniter」な方法を探しています。ヒントはありますか?

4

2 に答える 2

1

あなたが話しているのはドライバーモデルです。実際、あなたが提案していることを行うことができます。

<?php
$this->{$search_method}->search($search_query);

CodeIgniterには、これを行うためのCI_Driver_Library&CI_Driverクラスがあります ( CodeIgniter Driversを参照してください)。

ただし、通常は、インターフェースを実装したり、あなたが行っているように抽象クラスを拡張したりする方が簡単であることがわかりました。継承は、CI のドライバーよりもうまく機能します。

于 2012-04-07T20:06:52.780 に答える
1

本当にできます$this->$search_method->search($search_query)。また、CI では、必要に応じてライブラリ名を割り当てることができます。

public function display($search_method, $search_query){
    $this->load->model($search_method, 'currentSearchModel');
    $this->currentSearchModel->search($search_query);
}
于 2012-04-07T10:01:59.197 に答える