加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 如何在CodeIgniter中为多个钩子使用相同的对象?

发布时间:2020-12-13 17:48:06 所属栏目:PHP教程 来源:网络整理
导读:我有以下钩子配置(在hooks.php中) $hook['post_controller_constructor'][] = array( 'class' = 'MY_DataCollection','function' = 'init','filename' = 'MY_DataCollection.php','filepath' = 'hooks');$hook['post_controller'][] = array( 'class' = 'MY_
我有以下钩子配置(在hooks.php中)

$hook['post_controller_constructor'][] = array(
    'class'     => 'MY_DataCollection','function'  => 'init','filename'  => 'MY_DataCollection.php','filepath'  => 'hooks'
);

$hook['post_controller'][] = array(
    'class'     => 'MY_DataCollection','function'  => 'post_controller','filepath'  => 'hooks'
);

我想要做的是在post_controller_constructor中实例化类,然后运行init方法.然后为post_controller运行post_controller但使用相同的实例.然而,CodeIgniter再次实例化该类.

接下来我尝试了一些我认为有点聪明的东西:

require_once APPPATH . 'hooks/MY_DataCollection.php';
$collection = new MY_DataCollection;

$hook['post_controller_constructor'][] = array(
    'function'  => array($collection,'init'),'filepath'  => 'hooks'
);

$hook['post_controller'][] = array(
    'function'  => array($collection,'post_controller'),'filepath'  => 'hooks'
);

这不起作用,因为CI中的钩子类确实需要,我得到:

Fatal error: Cannot redeclare class MY_DataCollection in /var/www/application/hooks/MY_DataCollection.php on line 7

所以我摆脱了文件路径信息:

require_once APPPATH . 'hooks/MY_DataCollection.php';
$collection = new MY_DataCollection;

$hook['post_controller_constructor'][] = array(
    'function'  => array($collection,'init')
);

$hook['post_controller'][] = array(
    'function'  => array($collection,'post_controller')
);

甚至没有尝试运行,因为在CI_Hooks类中有_run_hook中的这个检查:

if ( ! isset($data['filepath']) OR ! isset($data['filename']))
{
    return FALSE;
}

我想我将不得不通过扩展这个类来覆盖这个函数,但我不能相信之前没有遇到过这种情况,并且没有任何更简单的方法来解决它.

谢谢

解决方法

嗯,似乎你需要在某处存储所需类的实例.
也许你可以这样做:

class MyHooks 
{
    public static $object_you_need;

    public function init() 
    {
        $object = new MyObject();
        $object->init();
        self::$object_you_need = $object;
    }

    public function post_controller()
    {
        $object = self::$object_you_need;
        // do stuff with that object
    }
}

不觉得漂亮,但我认为它有效.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读