我正在开发一个MVC框架,我在声明帮助类时制作灵活的代码/结构存在问题
class Controller {
public $helper = [];
public function load_helper($helper) {
require_once(DIR_HELPER . $helper . '.php');
$lc_helper = StrToLower($helper);
$helper_arr[$lc_helper] = new $helper;
$this->helper[$lc_helper] = $helper_arr[$lc_helper];
}
}
//我正在调用我的控制器中的函数
Class Home Extends Controller {
$this->load_helper('Form');
$this->helper['form']-><class function>;
}
我想调用这样的函数:
$this->form-><class function>;
我不能将摘要用于公共函数,但我已经看到了可以执行此操作的框架。
我希望有人有一个想法,有人可以理解我的问题,提前谢谢。
答案 0 :(得分:5)
看看神奇的__get
方法。来自文档:
PHP中的重载提供了动态“创建”属性的方法 和方法。这些动态实体通过魔术方法处理 人们可以在课堂上建立各种行动类型。
当与属性交互时,重载方法是 nvoked 或者尚未声明或在...中不可见的方法 目前的范围。本节的其余部分将使用这些术语 “不可访问的属性”和“无法访问的方法”来指代这一点 宣言和知名度的结合。
这可以通过以下方式实现:
class Controller {
public $helper = [];
public function load_helper($helper) {
require_once(DIR_HELPER . $helper . '.php');
$lc_helper = StrToLower($helper);
$helper_arr[$lc_helper] = new $helper;
$this->helper[$lc_helper] = $helper_arr[$lc_helper];
}
public function __get($property) {
//Load helper if not exists
if (!isset($this->helper[$property])) {
$this->load_helper($property);
}
//Return the helper
return $this->helper[$property];
}
}
旁注:
我理解的 Controller::$helper
和Controller::load_helper()
应该是private
或protected
而不是public
。