我正在编写一个图书馆搜索引擎,用户可以使用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
}
}
现在,我定义一个Controller来使用这些类并显示我的结果,
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”的方式来实现这种抽象。任何提示?
答案 0 :(得分: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);
}
答案 1 :(得分:1)
你在谈论它的驱动模型。事实上,你可以做你不建议做的事情:
<?php
$this->{$search_method}->search($search_query);
CodeIgniter有CI_Driver_Library
&amp;要执行此操作的CI_Driver
个类(请参阅CodeIgniter Drivers)。
但是,我发现实现一个接口/扩展一个像你正在做的抽象类通常更简单。继承比CI的驱动程序更好。