2012-02-04 29 views
6

Tworzę bibliotekę dla CodeIgniter i chcę przekazać wiele parametrów różnych typów (obiekt PDO, nazwa użytkownika i hasło, konfiguracje itp.).Jak przekazać wiele parametrów do biblioteki w CodeIgniter?

Wiem, że mogę przekazać tablicę wszystkich tych rzeczy, ale to nie wydaje się być najlepszym sposobem robienia rzeczy (jako że $params nigdy nie może opisać, co jest potrzebne).

Jak mogę przekazać wiele parametrów do biblioteki?

Z góry dziękuję.

+0

ja nie używałem CodeIgniter więc kiedy mówisz „biblioteka” masz na myśli przekazywania parametrów podczas wystąpienia klasy ? –

+0

Tak, zwykle robi się to za pomocą '$ this-> load-> library ('nazwa_listy', $ params)', ale chcę przekazać więcej niż jeden '$ param'. –

+1

Co jest nie tak z tablicą? $ params = array (...) –

Odpowiedz

6

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!

+0

Twój jest najbardziej informacyjny, poddaję się, nie będę edytować źródła CI, ponieważ może to wywoływać problemy. +1 + V, wielkie dzięki :) –

+0

+1 landonów, dziękuję za niesamowite informacje. – Alex

+0

Bardzo się cieszę, że pomogło. Szczerze mówiąc, prawdopodobnie powiem o tym sobie później, kiedy zapomnę. – landons

0

Domyślnie w CodeIgniter nie można. Możesz przekazać pojedynczy param do swoich klas bibliotecznych. Jak już wcześniej wspomniano, parametr może być tablicą zawierającą wszystkie inne parametry i można go po prostu użyć jako $param[0], $param[1].... Ale zgadzam się z tobą, to trochę dziwne i brzydkie widzieć.

Jeśli masz PHP5+, jest ReflectionClass, który może ci w tym pomóc, ale powinieneś edytować kod źródłowy CodeIgniter i zaimplementować tę funkcję. Funkcja, której szukasz, to ReflectionClass::newInstance(), pod którą można znaleźć here.

+0

Co mogę zrobić z klasą odbicia? –

+0

@Truth, jak powiedziałeś, możesz wywołać argumenty przekazujące nową klasę do konstruktora. Musisz tylko przeczytać dokumentację dotyczącą 'ReflectionClass :: newInstance()' tutaj. – Shoe

1

Z mojego doświadczenia z CodeIgniter, chyba zmodyfikować klasę loader działać inaczej (jak można wiedzieć, w application/core/ folderu gdzie masz do wdrożenia ci niestandardowej klasy) nie ma możliwości (nikt o tym nie wiem)

Używam wielu bibliotek zewnętrznych (głównie api sdks lub iskier) i lubię budować własne pliki konfiguracyjne, w których można ustawiać wartości, które będą ładowane do bibliotek po ich wywołaniu, więc kiedy potrzebuję załadować biblioteki po prostu buduję prosty lub wielowymiarowy $params = array() zgodnie z moimi potrzebami, a następnie pracy z nim wewnątrz biblioteki.

Tak więc w krótkiej odpowiedzi, $this->load->library('lib_name', $params) jest jedynym sposobem, jaki znam.

1

Można pominąć klasę modułu ładującego kodowanie i bezpośrednio tworzyć obiekty. APPPATH to stała sygnatury kodu.

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

Użycie jest takie samo, jak w przypadku załadowania biblioteki do klasy programu ładującego kodowanie.

Ja osobiście nie lubię przekazywać tablic do moich zajęć, ponieważ wtedy musisz sprawdzić zawartość. PHP może zająć się tym, gdy parametry są przekazywane do __construct() indywidualnie.

-1

to najlepszy sposób: stworzyć duży wachlarz

$data1=array('item1','item2','item3'); 
$arr=array('data1'=>$data1,'data2'=>'item4','data3'=>'item5');//create big array of datas 

extract($arr);//convert that to variables again after send to library 
//use that again 
print_r($data); 
echo $data2; 
echo $data3; 
0

użytkowania $this->upload->initialize($configUpload); po $this->load->library('upload', $configUpload);

Powiązane problemy