Php CI:在控制器中使用相同功能的最佳实践

Php CI:在控制器中使用相同功能的最佳实践,php,codeigniter,Php,Codeigniter,我有类名Deal,里面有函数名addit 我还有另一个控制器名Public,我想通过扩展它来使用属于类Deal的addit函数 class Public extends Deal { public function addit() { //my function } } 我对Codeigniter很陌生,只是阅读了一些参考资料,在这个网站上看了另一个问题,已经有了一些答案,但我不知道哪一个是它的最佳实践,这里是我找到的一些解决方案: 1.创建交易

我有类名Deal,里面有函数名addit

我还有另一个控制器名Public,我想通过扩展它来使用属于类Deal的addit函数

class Public extends Deal {
       public function addit() {
          //my function
       }
}
我对Codeigniter很陌生,只是阅读了一些参考资料,在这个网站上看了另一个问题,已经有了一些答案,但我不知道哪一个是它的最佳实践,这里是我找到的一些解决方案:

1.创建交易文件并保存在应用程序/库功能中,以便其他控制器可以使用其功能

2.在应用程序/助手上创建addit函数,以便我们可以在任何地方使用它的函数

3.在应用程序/核心中创建交易文件,以便其他控制器可以使用其功能


我的问题是,解决我的问题的最佳实践是什么,还有其他解决方案吗?

这取决于我们在这里讨论的函数类型。 如果它是一个非常简单的函数,不进行任何db访问或与CI组件交互,则可以创建一个帮助器:

引用codeigniter文档:

帮助程序不是以面向对象的格式编写的。它们是简单的, 程序功能。每个助手函数执行一个特定任务, 不依赖于其他功能


但是,如果它是一个相对复杂的代码,那么你应该考虑编写一个库:

在应用程序/库中创建Tools.php(或任何您想要的)

如果您的库需要经常使用,您可以在config/autoload.php中一次性加载它:

$autoload['libraries'] = array('database', 'tools', '...');
关于图书馆的CI文档:


选项3不适合您的问题,因为您没有扩展CI本身


点评:顾名思义,“核心”是为了提升CI的核心。例如,如果你不喜欢CI处理会话的方式,那么你可以编写一个新的核心类,但是,如果是关于你的用户管理系统,那么它与你的应用程序有关,而不是框架,应该在库中完成。

好的,先生,我明白你关于库和助手的观点,但是当你说选项3不合适时,我不明白,如果我在application/core内部创建类Deal,而另一个控制器使用Deal类,这是否不好?顾名思义,“core”用于改进CI的核心。例如,如果您不喜欢CI处理会话的方式,那么您可以编写一个新的核心类,但是,如果它是关于您的用户管理系统的,那么它与您的应用程序有关,而不是与框架有关,应该在库中完成。@AdrienXL请您详细解释一下
$this->CI=&get_instance()
,谢谢:)@vahidnajafi,当您在扩展CI_控制器或CI_模型的类中工作时,可以使用$this访问类父级的成员。但是,在lib中,您不扩展任何内容,因此无法访问已知的$this。由于CI实现了单例模式,您可以使用get_instance()检索神奇的$this。希望清楚。@AdrienXL非常感谢:)
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Tools
{
  protected $ci;

    public function __construct()
    {
        $this->ci =& get_instance(); 
        //Allows you to access CI components
    }

    public function myfunction($data)
    {
       //If you want to use codeigniter's functionalities :
       //use $this->ci->function()
    }

}
$this->load->library("tools");
$this->tools->myfunction($data);
$autoload['libraries'] = array('database', 'tools', '...');