【问题标题】:Overwrite CodeIgniter Common.php覆盖 CodeIgniter Common.php
【发布时间】:2013-04-05 12:06:47
【问题描述】:

system/core/Common.php下的code igniter中有一个方法叫load_class()。

我想覆盖这个方法。通常要覆盖代码点火器类,我会创建一个文件,例如 MY_Common.php 但是在这种情况下 Common.php 是方法的集合,并且没有封装它们的类.

那么我到底该怎么做呢?

【问题讨论】:

  • 为什么要覆盖那个方法?
  • 好吧,您可以只在 MY_Controller::__constructor() 或挂钩中为您的 haml 包含 + 自动加载器注册的两行代码,而您不必摆弄 CI 内部。
  • 顺便说一句,您在示例中看到文件以 use 开头,我需要这些吗? github.com/arnaud-lb/MtHaml/blob/master/examples/example.php
  • 我们在这里变得严重偏离主题,但我会将示例代码移动到MY_Controller::__constructor(没有use-es)直到第10行,使它像$this->haml = new Environment('twig');,所以在你的控制器中你可以简单地做$this->haml->compileString(...);类似于this

标签: codeigniter


【解决方案1】:

内置的扩展机制没有官方支持的方式来做到这一点。考虑其他方式来实现您的目标。

然而Common.php 中的函数都包裹在if 中,检查该函数是否已经存在,因此您可以执行以下操作:

  1. 创建您的 MY_Common.php 并将其放在项目中的某个位置(也许 application/core/ 以反映其他类似的扩展)
  2. 在项目的根目录中打开您的 index.php 文件
  3. 插入include APPPATH.'core/MY_Common.php';之前结束
    require_once BASEPATH.'core/CodeIgniter.php';

现在,如果您的 MY_Common.php 中有 load_class 函数,它将影响原始版本。

【讨论】:

  • 我明白了,自然有点骇人听闻,因为它不受支持但可以工作,谢谢。
  • 好的,好方法,但是当我需要同时使用这两个函数时如何调用它们?在您的解决方案中,我们正在失去原来的功能。
  • @kasra,简短的回答是你不能。 PHP 不允许您将它们都使用相同的名称,并且您希望您的版本具有原始名称(这是重点)。在我看来,最简单的方法是您只需编辑原始文件并重命名,或者向文件添加命名空间。恐怕你在这里不走运 php,也许如果你有 runkit 你可以让它与 runkit_function_rename 一起工作
  • @complex857,这个 hackish 解决方案可以工作,因为 codeigniter 已经为 Common.php 中所有定义的函数使用了 if ( ! function_exists('***')) 包装器
【解决方案2】:

这样做的正确/官方方法是将核心通用功能覆盖到 ie 中。 common_helper.phpapplication/helpers 并设置在config/autoload.php

【讨论】:

  • 这不起作用,因为 Common.php 在助手之前加载,导致Fatal error: Cannot redeclare log_message()...
猜你喜欢
  • 2012-09-16
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
  • 2012-01-18
  • 2019-07-30
相关资源
最近更新 更多