Как передать несколько параметров в библиотеку в CodeIgniter? - PullRequest
6 голосов
/ 04 февраля 2012

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

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

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

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

Ответы [ 6 ]

6 голосов
/ 05 февраля 2012

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

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

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

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

ура!

1 голос
/ 22 мая 2014

Можно обойти класс загрузчика Codeigniters и создать экземпляры объектов напрямую. 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();

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

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

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

1 голос
/ 05 февраля 2012

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

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

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

0 голосов
/ 11 октября 2016

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

0 голосов
/ 22 июня 2016

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

$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 голосов
/ 04 февраля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...