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

How to pass multiple parameters to a library in CodeIgniter?

提问人:Madara's Ghost 提问时间:2/4/2012 更新时间:10/12/2016 访问量:6051

问:

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

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

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

提前致谢。

php codeigniter

评论

0赞 Jeremy Harris 2/4/2012
我没有使用过 CodeIgniter,所以当你说“库”时,你的意思是在实例化一个类时传递参数吗?
0赞 Madara's Ghost 2/4/2012
是的,它通常是用 完成的,但我想通过不止一个。$this->load->library('lib_name', $params)$param
1赞 The Alpha 2/4/2012
数组有什么问题?$params=数组(...)

答:

0赞 Shoe 2/5/2012 #1

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

如果你有 ReflectionClass 可以帮助你解决这个问题,但你应该编辑 CodeIgniter 的源代码并实现这个函数。您正在寻找的功能是您可以在这里找到的。PHP5+ReflectionClass::newInstance()

评论

0赞 Madara's Ghost 2/5/2012
我可以用反射类做什么?
0赞 Shoe 2/5/2012
@Truth,如前所述,您可以调用一个新类,将参数传递给构造函数。你只需要阅读关于这里的文档。ReflectionClass::newInstance()
1赞 Alex 2/5/2012 #2

根据我使用 CodeIgniter 的经验,除非你修改类以不同的方式操作(你可能知道,在文件夹中是你必须实现自定义类的地方),否则没有办法(我不知道)loaderapplication/core/

我使用许多外部库(主要是 api sdk 或 sparks),我喜欢构建自己的配置文件,在其中设置值,这些值在调用它们时将加载到库中,因此当我需要加载库时,我只是根据需要构建一个简单或多维的库,然后在库内使用它。$params = array()

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

7赞 landons 2/5/2012 #3

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

关联数组参数:

这种方法非常灵活,因为参数的顺序无关紧要,它解决了许多人对 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 类:

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

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

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

干杯!

评论

0赞 Madara's Ghost 2/5/2012
你的是信息量最大的,我投降,我不会编辑 CI 的来源,因为它可能会引起问题。+1 +V,非常感谢:)
0赞 landons 2/6/2012
很高兴它有所帮助。老实说,当我忘记时,我可能会自己参考这一点。
2赞 T. Brian Jones 5/23/2014 #4

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

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 可以为您处理这个问题。

-1赞 mehdihajatpour 6/22/2016 #5

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

$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;
0赞 lal rishav 10/11/2016 #6

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