加载CodeIgniter库的替代方法,以便它们能够自动完成

时间:2012-01-05 08:52:31

标签: php oop codeigniter

在CodeIgniter中,是否可以加载库&模型如下:

$my_library = new my_library();

我想这样做的原因是因为我使用的编辑器(Komodo Edit)在使用$this->load时无法识别用于自动完成的类。

4 个答案:

答案 0 :(得分:4)

在某些情况下,可以加载类似的类,但是你应该坚持使用CodeIgniter加载器类,除非绝对必要不这样做。我建议您将库和模型转换为与CodeIgniter加载器类兼容。

当您说自动填充功能不起作用时,我理解您的意思。我使用NetBeans,这也是我遇到的问题。我做了一点挖掘,尽管对Komodo Edit的记录要少得多,但是使自动完成正常工作的解决方案非常类似于使用NetBeans。

首先,这是一个Komodo Edit bug report,记录您遇到的问题。它自2008年开放以来,因为有一个简单的解决方法,它很可能不会直接进入应用程序。

这是blog post detailing the workaround。我们的想法是在项目的根目录中创建一个虚拟PHP文件,其中包含许多引用核心CodeIgniter类的属性和方法的注释。然后,Komodo Edit将引用该文件,并将属性和方法添加到代码完成中。

博客文章看起来有些过时,但您应该能够轻松修改它以使其适用于您正在使用的任何版本的CodeIgniter。

如果你很好奇,这里是blog post detailing the same solution for Netbeans

答案 1 :(得分:2)

这是我尝试使用名称空间(5.3+)和spl_autoload_register()的模型的新方法。要让它也适用于图书馆也不会太难:

<?php

class MY_Loader extends CI_Loader {

    protected static $CI;

    public function __construct()
    {
        parent::__construct();
        self::$CI =& get_instance();
    }

    public static function autoload($class_name)
    {
        if (substr($class_name, 0, 7) == 'Models\\')
        {
            self::$CI->load->model(substr($class_name, 7));
        }
    }

    public function singleton($model_name)
    {
        if ( !class_exists('Models\\'.$model_name) || empty(self::$CI->$model_name))
        {
            $this->model($model_name);
        }

        return self::$CI->$model_name;
    }

    public function factory($model_name, $params = NULL)
    {
        if ( !class_exists('Models\\'.$model_name))
        {
            $this->model($model_name);
        }

        if (count($params) < 2)
        {
            return new self::$CI->$model_name($params);
        }
        else
        {
            $reflection_class = new ReflectionClass('Models\\'.$model_name);
            return $reflection_class->newInstanceArgs($params);
        }
    }
}

spl_autoload_register('MY_Loader::autoload');

命名空间的原因:

  1. 我经常发现自己想要一个“帐户”控制器和一个“帐户”模型,不用担心冲突很好
  2. 我在自动加载器中自动知道它是一个应该加载的模型,所以我可以安全地加载模型并完成
  3. <强>用途:

    • 您可以像往常一样使用new ClassName()简单地实例化对象(您的IDE应该选择它)
    • 您可以使用$this->load->singleton($class_name)加载单例 - 我仍需要对此部分进行一些操作,因为如果您自动加载第一个实例,它实际上不会是单例,然后使用{{1 }} 之后。此功能与$this->load->singleton()基本相同,但更具自我描述性。
    • 您可以使用$this->load->model()加载工厂实例。这很好,因为你可以链接方法调用,并根据给定的参数在构造函数中加载一些奇特的数据库。

答案 2 :(得分:0)

我认为调用这样的库不会起作用。您可以尝试使用php include / require函数手动在页面中包含该类,理论上这将允许您以这种方式创建实例。

原谅我,但我不明白你的意思是你的编辑没有认识到它。

答案 3 :(得分:0)

您是否尝试将库目录添加到项目属性中? 我认为这可以帮助http://community.activestate.com/node/7590(由于我不使用komodo,我不太确定)