Istnieje kilka podejść do tego konkretnego problemu. Będę listy (w preferowanej kolejności) sposoby Znam go rozwiązać:
asocjacyjna Argumenty:
Takie podejście jest dość elastyczny, jak kolejność parametrów nie ma znaczenia, a to rozwiązuje dość duża skarga dotyczy tego, jak PHP definiuje parametry funkcji. Po prostu przekazujesz pożądane parametry "inne niż domyślne". Jest to prawdopodobnie najbardziej "codeigniterish" sposób, aby to zrobić, jeśli to nawet coś.
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'
));
numerowe argumenty
Podejście replikuje typowy paradygmat parametru PHP (definiuje nazwy, polecenia i wartości domyślnych dla wszystkich oczekiwanych parametrów).
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'));
przesłonić klasa CI Ładowarka:
To NA WŁASNE RYZYKO. Zasadniczo, metoda CI_Loader::_ci_init_class()
musi zostać nadpisana klasą MY_Loader
i odpowiednią metodą.Są to linie, które „nie lubię” (wiersze 1003-1012 w mojej instalacji):
// Instantiate the class
$CI =& get_instance();
if ($config !== NULL)
{
$CI->$classvar = new $name($config);
}
else
{
$CI->$classvar = new $name;
}
z „najbezpieczniejszych” zastępczą, która mogłaby Chyba byłoby to:
// 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;
}
I naprawdę nie wiem, ile rzeczy to się zepsuje, ale prawie na pewno mogę powiedzieć, że coś będzie. To naprawdę nie warte ryzyka. SILNIE polecam pierwsze podejście powyżej.
Pozdrawiam!
ja nie używałem CodeIgniter więc kiedy mówisz „biblioteka” masz na myśli przekazywania parametrów podczas wystąpienia klasy ? –
Tak, zwykle robi się to za pomocą '$ this-> load-> library ('nazwa_listy', $ params)', ale chcę przekazać więcej niż jeden '$ param'. –
Co jest nie tak z tablicą? $ params = array (...) –