7 Stimmen

Wie kann man mehrere Parameter an eine Bibliothek in CodeIgniter übergeben?

Ich mache eine Bibliothek für CodeIgniter, und ich möchte mehrere Parameter verschiedener Typen (ein PDO-Objekt, Benutzername und Kennwort, Konfigurationen, etc) übergeben.

Ich weiß, dass ich ein Array mit all diesen Dingen übergeben kann, aber das scheint nicht der beste Weg zu sein (da $params kann nicht immer beschreiben, was gebraucht wird).

Wie kann ich mehrere Parameter an eine Bibliothek übergeben?

Vielen Dank im Voraus.

7voto

landons Punkte 9454

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!

2voto

T. Brian Jones Punkte 12290

Man kann Codeigniters Loader-Klasse umgehen und Objekte direkt instanziieren. APPPATH ist eine Codeigniter-Konstante.

require_once( APPPATH.'libraries/some_class.php' );
$this->Some_class = new Some_class( param_1, param_2, param_n );
$this->Some_class->do_something();

Die Verwendung ist dieselbe, als ob Sie die Bibliothek mit Codeigniters Loader-Klasse geladen hätten.

$this->load->library( 'some_class' )
$this->Some_class->do_something();

Ich persönlich mag es nicht, wenn ich Arrays an meine Klassen übergebe, weil man dann den Inhalt validieren muss. PHP kann dies für Sie übernehmen, wenn die Parameter einzeln an __construct() übergeben werden.

1voto

Alex Punkte 7408

Aus meiner Erfahrung mit CodeIgniter, es sei denn, Sie ändern die loader Klasse anders zu handeln (wie Sie vielleicht wissen, in application/core/ Ordner ist, wo Sie Ihre benutzerdefinierte Klasse implementieren müssen) gibt es keine Möglichkeit (keine, die ich kenne)

Ich benutze viele externe Bibliotheken (meist api sdks oder Funken) und ich mag meine eigenen Konfigurationsdateien zu bauen, wo Werte, die in Bibliotheken geladen werden, wenn auf sie aufgerufen werden, so dass, wenn ich Bibliotheken laden müssen ich nur eine einfache oder mehrdimensionale bauen $params = array() nach meinen Bedürfnissen zu erstellen und dann in der Bibliothek damit zu arbeiten.

Daher die kurze Antwort, $this->load->library('lib_name', $params) ist die einzige Möglichkeit, die mir bekannt ist.

0voto

Shoe Punkte 72596

Standardmäßig kann man das in CodeIgniter nicht. Sie können nur einen einzigen Parameter an Ihre Bibliotheksklassen übergeben. Wie bereits erwähnt, könnte dieser Parameter ein Array sein, das alle anderen Parameter enthält, und man könnte ihn einfach als $param[0], $param[1]... . Aber ich stimme Ihnen zu, es ist irgendwie seltsam und hässlich zu sehen.

Wenn Sie eine PHP5+ gibt es die ReflectionClass die Ihnen dabei helfen könnten, aber Sie sollten den Quellcode von CodeIgniter bearbeiten und diese Funktion implementieren. Die Funktion, die Sie suchen, ist ReflectionClass::newInstance() die Sie finden können aquí .

0voto

lal rishav Punkte 489

Verwenden. $this->upload->initialize($configUpload); nach $this->load->library('upload', $configUpload);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X