Я пишу поисковую систему библиотеки, где пользователь может искать по различным критериям (например, автор, название, издатель и т. Д.) С помощью CodeIgniter. Итак, я определил интерфейс BookSearch
который все классы, ответственные за поиск в базе данных будет осуществлятьОборация OOP с помощью моделей CodeIgniter
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» способ сделать эту абстракцию. Любые намеки?