Как передать несколько параметров в библиотеку в CodeIgniter?

Я делаю библиотеку для CodeIgniter, и я хочу передать несколько параметров разных типов (объект PDO, имя пользователя и пароль, конфигурации и т. Д.).

Я знаю, что могу передать массив из всех этих вещей, но это, кажется, не лучший способ делать вещи (поскольку $params никогда не может описать, что нужно).

Как передать несколько параметров в библиотеку?

Заранее спасибо.

Существует несколько подходов к этой конкретной проблеме. Я буду перечислять (в порядке) способы, которые я знаю, чтобы решить эту проблему:

Аргументы ассоциативной матрицы:

Этот подход довольно гибкий, поскольку порядок параметров не имеет значения, и он разрешает довольно большую жалобу, с которой многие сталкиваются с тем, как 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; } 

Я действительно не знаю, сколько вещей это сломает, но я почти наверняка могу сказать, что что-то будет. Это не стоит того риска. Я бы настоятельно рекомендовал первый подход выше.

Ура!

Из моего опыта работы с CodeIgniter, если вы не измените класс loader чтобы действовать по-другому (как вы, возможно, знаете, в application/core/ папке вы должны реализовать свой пользовательский класс), нет никакого способа (никто из этого я знаю)

Я использую много внешних библиотек (в основном api sdks или sparks), и мне нравится создавать свои собственные файлы конфигурации, где устанавливать значения, которые будут загружаться в библиотеки при вызове, поэтому, когда мне нужно загружать библиотеки, я просто создаю простой или многомерный $params = array() соответствии с моими потребностями, а затем работать с ним внутри библиотеки.

Таким образом, в коротком ответе, $this->load->library('lib_name', $params) является единственным способом, о котором я знаю.

Можно обойти класс Codeigniters Loader и напрямую создавать объекты. APPPATH – константа Codeigniter.

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

Использование такое же, как если бы вы загрузили библиотеку с классом Loader Codeigniters.

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

Мне лично не нравится передавать массивы на мои занятия, потому что вам нужно проверить содержимое. PHP может позаботиться об этом для вас, когда параметры передаются в __construct () индивидуально.

По умолчанию в CodeIgniter вы не можете. Вы можете передать только один параметр в классы библиотеки. Как указывалось ранее, param может быть массивом, который содержит все остальные параметры, и вы можете просто использовать его как $param[0], $param[1]... Но я согласен с тобой, это странно и уродливо видеть.

Если у вас есть PHP5+ есть ReflectionClass, который может помочь вам в этом, но вы должны отредактировать исходный код CodeIgniter и реализовать эту функцию. Функция, которую вы ищете, это ReflectionClass::newInstance() которую вы можете найти здесь .

используйте $this->upload->initialize($configUpload); после $this->load->library('upload', $configUpload);

это лучший способ: создать большой массив

 $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;