我正在编写一个库搜索引擎,用户可以使用 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”的方式来进行这种抽象。有什么提示吗?