我正在为 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/