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

标签 php codeigniter

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

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

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

提前致谢。

最佳答案

有几种方法可以解决这个特定问题。我将列出(按首选顺序)我知道的解决方法:

关联数组参数:

这种方法非常灵活,因为参数的顺序无关紧要,而且它解决了很多人对 PHP 定义函数参数的方式的很大提示。您只需传入所需的“非默认”参数即可。这可能是最“codeigniterish”的方式来做到这一点,如果那是一回事的话。

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;
    }

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

干杯!

关于php - 如何将多个参数传递给 CodeIgniter 中的库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9141933/

相关文章:

php - 保存图片的php代码

php - 分页未传递总页值

apache - .htaccess 未从 DocumentRoot 目录中正确读取

javascript - CodeIgniter Controller 如何接受 ajax post

php - 当表单包含大量输入时,表单数据被截断/丢失?

php - 在 Laravel-5 中取消定义方法?

php - IF ELSE、PHP 和 CSS

mysql - 使用的 SELECT 语句在 codeigniter 中具有不同的列数

Codeigniter 捕获数据库错误

php - 如何使用 CakePHP 检查模型是否存在?