donglugou6652 2018-03-06 05:25
浏览 104
已采纳

在动态加载时使用类

I've been lurking into CI's Loader class and I am a bit interested about how it loads models/libraries/etc.

For example:

//Mode class person
$this->load->model('person');

and it can instantly be used:

$this->person->method();

Can somebody share some code on how to do something like this? As much as possible I don't want to use something like:

$Person = $this->mycustomloader->mycustommodel->('person);

but:

$this->mycustomloader->mycustommodel('person');
$this->person->mycustommethod();

Thanks in advance!

  • 写回答

1条回答 默认 最新

  • dqfaom241360 2018-03-06 06:00
    关注

    How its done in CI's case is that they heavily rely on passing stuff by reference (singleton), so calling $this->load->model('person') invokes the person model and assigns it back into the controller.

    You can see exactly how its done by looking at the source of the project on GitHub.

    But in a nutshell:

    <?php
    // https://github.com/bcit-ci/CodeIgniter/blob/635256265a38e655c00f4415d5f09700f28c5805/system/core/Common.php#L140
    function load_class($class) {
        return (new $class());
    }
    
    // https://github.com/bcit-ci/CodeIgniter/blob/b862664f2ce2d20382b9af5bfa4dd036f5755409/system/core/CodeIgniter.php#L316
    function &get_instance() {
        return CI_Controller::get_instance();
    }
    
    // https://github.com/bcit-ci/CodeIgniter/blob/b862664f2ce2d20382b9af5bfa4dd036f5755409/system/core/Loader.php#L359
    class CI_Loader
    {
        public function model($model, $name = '', $db_conn = FALSE)
        {
            $class = $model.'Model';
            $CI =& get_instance();
            $CI->{$model} = new $class;
        }
    }
    
    // https://github.com/bcit-ci/CodeIgniter/blob/b862664f2ce2d20382b9af5bfa4dd036f5755409/system/core/Controller.php#L52
    class CI_Controller {
        private static $instance;
    
        public function __construct()
        {
            self::$instance =& $this;
            $this->load =& load_class('CI_Loader');
        }
    
        /**
         * Get the CI singleton
         *
         * @static
         * @return  object
         */
        public static function &get_instance()
        {
            return self::$instance;
        }
    }
    
    // your models
    class fooModel {
        public $foo;
    }
    
    class barModel {
        public $bar;
    }
    
    // your controller
    class Controller extends CI_Controller {
    
        public function indexAction()
        {
            $this->load->model('foo');
            $this->load->model('bar');
        }
    }
    
    // instance container
    $app = (new class{});
    $app->controller = new Controller();
    
    // loaded by router
    $app->controller->indexAction();
    
    print_r($app);
    

    Result (ignoring error):

    class@anonymous Object
    (
        [controller] => Controller Object
            (
                [load] => Loader Object
                    (
                    )
    
                [foo] => fooModel Object
                    (
                        [foo] => 
                    )
    
                [bar] => barModel Object
                    (
                        [bar] => 
                    )
    
            )
    
    )
    

    https://3v4l.org/fPCK3

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?