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」な方法を探しています。ヒントはありますか?