如何将多个参数传递给CodeIgniter中的库?

时间:2012-02-04 15:25:52

标签: php codeigniter

我正在为CodeIgniter创建一个库,我希望传递不同类型的多个参数(PDO对象,用户名和密码,配置等)。

我知道我可以传递所有这些东西的数组,但这似乎不是最好的做事方式(因为$params无法描述所需要的东西)。

如何将多个参数传递给库?

提前致谢。

6 个答案:

答案 0 :(得分:6)

这个特殊问题有几种方法。我会列出(按照首选顺序)我知道的解决方法:

关联数组参数:

这种方法非常灵活,因为参数的顺序无关紧要,并且它解决了很多人对PHP如何定义函数参数的抱怨。您只需传入所需的“非默认”参数即可。这可能是最“代码化”的方式,如果这甚至是一件事。

class MyLibrary {

    public function __construct($params = array())
    {
        // Merge default parameter names and values,
        // with given $params array
        $params = array_merge(array(
            'server'   => 'myserver',
            'database' => 'mydatabase',
            'username' => 'myuser',
            'password' => 'mypassword'
        ), $params);

        // Create variables from parameter list
        extract($params);

        var_dump($server);
        var_dump($database);
        var_dump($username);
        var_dump($password);
    }

}

// Initialization:
$this->load->library('mylibrary', array(
    'server'   => 'server-arg1',
    'database' => 'database-arg2'
));

编号参数:

此方法复制典型的PHP参数范例(定义所有预期参数的名称,顺序和默认值)。

class MyLibrary {

    public function __construct($params = array())
    {
        // Add relevant defaults to missing parameters
        $params = array_merge($params, array_slice(array(
            'myserver',
            'mydatabase',
            'myuser',
            'mypassword'
        ), count($params)));

        // Create variables from parameter list
        extract(array_combine(array(
            'server',
            'database',
            'username',
            'password'
        ), $params));

        var_dump($server);
        var_dump($database);
        var_dump($username);
        var_dump($password);
    }

}

// Initialization:
$this->load->library('mylibrary', array('server-arg1', 'database-arg2'));

覆盖CI Loader类:

这是您自己承担的风险。基本上,CI_Loader::_ci_init_class()方法需要用MY_Loader类和相应的方法覆盖。这些是你“不喜欢”的行(我的安装中的第1003-1012行):

    // Instantiate the class
    $CI =& get_instance();
    if ($config !== NULL)
    {
        $CI->$classvar = new $name($config);
    }
    else
    {
        $CI->$classvar = new $name;
    }

我能猜到的“最安全”的替代品是:

    // Instantiate the class
    $CI =& get_instance();
    if (isset($config[1])
    {
        // With numeric keys, it makes sense to assume this is
        // is an ordered parameter list
        $rc = new ReflectionClass($name);
        $CI->$classvar = $rc->newInstanceArgs($config);
    }
    elseif ($config !== NULL)
    {
        // Otherwise, the default CI approach is probably good
        $CI->$classvar = new $name($config);
    }
    else
    {
        // With no parameters, it's moot
        $CI->$classvar = new $name;
    }

我真的不知道会破坏多少东西,但几乎可以肯定地说会有一些东西。这不值得冒风险。我强烈推荐上面的第一种方法。

干杯!

答案 1 :(得分:1)

根据我对CodeIgniter的使用经验,除非您修改loader类以采取不同的行为(您可能知道,在application/core/文件夹中是您必须实现自定义类的地方),否则没有办法(我不知道其中任何一个人)

我使用了很多外部库(主要是api sdks或sparks),我喜欢构建自己的配置文件,在那里设置将在调用时加载到库中的值,所以当我需要加载库时,我只需构建一个根据我的需要简单或多维$params = array(),然后在库中使用它。

简而言之,$this->load->library('lib_name', $params)是我所知道的唯一方式。

答案 2 :(得分:1)

可以回避Codeigniters Loader类并直接实例化对象。 APPPATH是一个Codeigniter常量。

require_once( APPPATH.'libraries/some_class.php' );
$this->Some_class = new Some_class( param_1, param_2, param_n );
$this->Some_class->do_something();

用法与使用Codeigniters Loader类加载库一样。

$this->load->library( 'some_class' )
$this->Some_class->do_something();

我个人不喜欢将数组传递给我的类,因为那时你必须验证内容。当参数单独传递给__construct()时,PHP可以为您解决这个问题。

答案 3 :(得分:0)

默认情况下,CodeIgniter不能。您只能将单个参数传递给库类。如前所述,param可以是包含所有其他参数的数组,您可以将其用作$param[0], $param[1]...。 但我同意你的看法,这有点奇怪和难看。

如果您有PHP5+ReflectionClass可以帮助您解决这个问题,但您应该编辑CodeIgniter的源代码并实现此功能。您要查找的功能是ReflectionClass::newInstance(),您可以找到here

答案 4 :(得分:0)

$this->upload->initialize($configUpload);

之后使用$this->load->library('upload', $configUpload);

答案 5 :(得分:-1)

这是最好的方法:创建一个大数组

$data1=array('item1','item2','item3');
$arr=array('data1'=>$data1,'data2'=>'item4','data3'=>'item5');//create big array of datas

extract($arr);//convert that to variables again after send to library 
//use that again
print_r($data);
echo $data2;
echo $data3;