PHP以类为值提取数组

men*_*ndz 6 php oop model-view-controller

我正在开发一个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];    
    }
}
Run Code Online (Sandbox Code Playgroud)

//我正在调用我的控制器中的函数

Class Home Extends Controller   {

    $this->load_helper('Form');

    $this->helper['form']-><class function>;
}
Run Code Online (Sandbox Code Playgroud)

我想调用这样的函数:

$this->form-><class function>;
Run Code Online (Sandbox Code Playgroud)

我不能将提取用于公共功能,但我已经看到可以做到这一点的框架.

我希望有人有一个想法,有人可以理解我的问题,提前谢谢.

Chr*_*rdt 5

看看神奇的__get方法.从文档:

PHP中的重载提供了动态"创建"属性和方法的方法.这些动态实体通过魔术方法处理,可以在类中为各种动作类型建立.

在与尚未声明或在当前范围中不可见的属性或方法交互时,调用重载方法.本节的其余部分将使用术语"不可访问的属性"和"不可访问的方法"来引用声明和可见性的这种组合.

这可以通过以下方式实现:

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];
    }
}
Run Code Online (Sandbox Code Playgroud)

边注:

Controller::$helperController::load_helper()在我的理解应该是privateprotected不是的public.