Codeigniter - 在库中加载库类

时间:2014-03-05 21:04:12

标签: php codeigniter codeigniter-2

我的应用程序适用于第三方应用程序。 Thirdparty应用程序是一个库类,它位于application/libraries/NAMEOFTHECLASS/main.php

我有一个库modulehandler,它有处理ThirdParty-Classes的工作。

第三方类看起来像这样:

 class main {

var $name;
var $description;
var $saphir;
var $location;

public function init($config = array()) {
    $this->name = $config['name'];
    $this->description = $config['description'];
    $this->saphir =& get_instance();
    $this->location = $config['location'];
}

public function getFormElements() {
   $html = $this->saphir->load->file($this->location.'/tpl/main.html',true);
   $this->saphir->load->library('parser');

   $data = array(
        'name' => $this->name,
        'description' => $this->description
        );

   $html = $this->saphir->parser->parse_string($html, $data, TRUE);
   return $html;
}

public function validation($post_data)
{
     $array = explode(',', $post_data);
     if($post_data != is_array($array) )
         return array("error" => array("name" => $this->name, "message" => "Bitte geben Sie nur eine Kommagetrennte Liste an"));

}

public function handleData($post_data) {
    $array = explode(',', $post_data);
    $return = array();
    foreach($array as $key => $val) {
        array_push($return, array("data" => $val));
    }
    return $return;
}
}

在模块处理程序中,我将每个第三方类加载到foreach中,并调用函数。

我的ModuleHandler类中的Zb是从Thirdparty脚本获取表单元素的方法:

    private function getForm()
    {

       $form_data = array();
        foreach($this->schema as $schema) {
            $config = array("type" => $schema['type'], "name" => $schema['name'], "description" => $schema['description'], 'location' => 'application/libraries/thirdparty/cm_system/'.$schema['type']);
            $type = $schema['type'];

            if($this->edit) {
                $value = $this->info;
                $val = array();
                foreach($value->ELEMENT as $element)
                {
                    $holder = (string)$element;
                    array_push($val, $holder);
                }
                $value = $val;
            }
            else  {
                $value = "";
            }

            $ins = $this->CI->load->library('thirdparty/cm_system/'.$type.'/main');
            $this->CI->main->init($config);

            $form_elements = $this->CI->main->getFormElements($value); 

            array_push($form_data, $form_elements);

        }
        return $form_data;
    } 

问题是,每个第三方类的名称为main。而且我得到的错误是我无法重新授课。 有没有办法取消加载的类?

我已经用未设置尝试过了。但它不起作用。

3 个答案:

答案 0 :(得分:1)

您可以使用小型黑客卸载库,为此您需要扩展Loader

在appilication / core / MY_Loader MY中创建一个来自$config['subclass_prefix']的前缀

class MY_Loader extends CI_Loader {

public function unload_library($name) {
    $name = strtolower($name);
    foreach ($this->_ci_loaded_files as $key => $path) {
        $file_name = basename($path);
        $value = substr($file_name, 0, strlen($file_name) - 4);
        if (strtolower($name) == strtolower($value)) {
            unset($this->_ci_loaded_files[$key]);
            $CI = & get_instance();
            unset($CI->$name);
        }
    }
}

}

现在您可以使用

卸载库
$this->load->unload_library('YOUR_LIB_NAME');

答案 1 :(得分:0)

你可以这样做:

$ins = $this->CI->load->library('thirdparty/cm_system/'.$type.'/main', null, $type);

如果您导航到/ci/system/core/loader.php,您会在#194行找到public function library()

public function library($library = '', $params = NULL, $object_name = NULL)

第三个参数允许您指定唯一的对象名称以避免冲突。

所以现在你可以简单地打电话:

$this->CI->load->library('thirdparty/cm_system/'.$type.'/main', null, $type);

// and use it like:
$this->$type->someFunction();

答案 2 :(得分:0)

由于CI不使用名称空间,因此无法使其正常工作。

这不是CI限制,它是PHP的限制。 CI span该文件,因此,如果您包含2个include的文件,它当然会崩溃。

最简单,最干净的解决方案是将您的类和相关文件命名为与该文件夹相同的名称。

即:

class Main

将“main”类命名为与文件夹相同是非常常见的。