Есть несколько подходов к этой конкретной проблеме. Я перечислю (в порядке предпочтения) способы, которые я знаю, чтобы решить это:
Аргументы ассоциативных массивов:
Этот подход довольно гибкий, так как порядок параметров не имеет значения, и он решает довольно большую жалобу, которую многие имеют в отношении того, как 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:
Это на свой страх и риск. По сути, метод 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;
}
Я действительно не знаю, сколько вещей это сломает, но я почти наверняка могу сказать, что что-то будет. Это не стоит риска. Я бы настоятельно рекомендовал первый подход выше.
ура!