Я делаю библиотеку для 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;