Für dieses spezielle Problem gibt es mehrere Ansätze. Ich werde (in bevorzugter Reihenfolge) Wege auflisten, die ich kenne, um es zu lösen:
Assoziative Array-Argumente:
Dieser Ansatz ist ziemlich flexibel, da die Reihenfolge der Parameter keine Rolle spielt, und er löst eine ziemlich große Beschwerde, die viele damit haben, wie PHP Funktionsparameter definiert. Man übergibt einfach die "Nicht-Standard"-Parameter, die man haben möchte. Dies ist wahrscheinlich der "codeigniterischste" Weg, wenn es so etwas überhaupt gibt.
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'
));
Nummerierte Argumente:
Dieser Ansatz repliziert das typische PHP-Parameter-Paradigma (definiert Namen, Reihenfolge und Standardwerte für alle erwarteten Parameter).
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'));
Überschreiben Sie die Klasse CI Loader:
Dies geschieht auf IHR EIGENES RISIKO. Grundsätzlich gilt, dass die CI_Loader::_ci_init_class()
Methode muss mit einer Option überschrieben werden MY_Loader
Klasse und die entsprechende Methode. Dies sind die Zeilen, die Sie "nicht mögen" (Zeilen 1003-1012 in meiner Installation):
// Instantiate the class
$CI =& get_instance();
if ($config !== NULL)
{
$CI->$classvar = new $name($config);
}
else
{
$CI->$classvar = new $name;
}
Der "sicherste" Ersatz, den ich mir vorstellen kann, wäre dieser:
// 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;
}
Ich weiß wirklich nicht, wie viele Dinge dabei kaputt gehen werden, aber ich kann mit ziemlicher Sicherheit sagen, dass es etwas geben wird. Es ist das Risiko nicht wirklich wert. Ich würde DRINGEND empfehlen, den ersten Ansatz oben.
Zum Wohl!