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

Mad*_*iha 6 php codeigniter

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

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

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

提前致谢.

lan*_*ons 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'
));
Run Code Online (Sandbox Code Playgroud)

编号参数:

此方法复制典型的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'));
Run Code Online (Sandbox Code Playgroud)

覆盖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;
    }
Run Code Online (Sandbox Code Playgroud)

我能猜到的"最安全"的替代品是这样的:

    // 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;
    }
Run Code Online (Sandbox Code Playgroud)

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

干杯!