2012-02-04 11 views
6

私はCodeIgniter用のライブラリを作成しています。異なるタイプの複数のパラメータ(PDOオブジェクト、ユーザ名とパスワード、設定など)を渡したいと思います。CodeIgniterで複数のパラメータをライブラリに渡すには?

私はこれらのすべての配列を渡すことができますが、それは($paramsが何が必要なのかを記述することができないため)最善の方法ではないようです。

複数のパラメータをライブラリに渡すにはどうすればよいですか?

ありがとうございます。

+0

後、私は、あなたが「ライブラリ」を言うときに、あなたがクラスをインスタンス化する際のパラメータを渡す意味ですかCodeIgniterのを使用していませんでした? –

+0

はい、通常は '$ this-> load-> library( 'lib_name'、$ params)'で行いますが、複数の '$ param'を渡したいと思います。 –

+1

配列に問題がありますか? $ params = array(...) –

答えて

6

この特定の問題にはいくつかのアプローチがあります。

連想配列引数:私はそれを解決するために、私が知っている(優先順)方法をリストアップします

このアプローチは、パラメータの順序は重要ではありませんので、かなり柔軟性があり、それが解決さ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 Loaderクラスは:

これは、お客様自身の責任です。基本的に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; 
    } 

I本当に何が壊れるかわからないが、何かがあるとほとんど確実に言える。それは本当にリスクに値するものではありません。私は強く上記の最初のアプローチをお勧めします。

乾杯!

+0

あなたの情報は最も有益ですが、私は断りますが、問題の原因となる可能性があるため、CIのソースを編集しません。 +1 + V、ありがとうたくさん:) –

+0

+1 landons、驚くべき情報に感謝します。 – Alex

+0

とても助かりました。正直なところ、後で私が忘れたときに私はこれを参照するでしょう。 – landons

0

デフォルトでは、CodeIgniterではできません。ライブラリクラスには1つのパラメータしか渡すことができません。前述のように、paramは他のすべてのパラメータを含む配列になる可能性があり、そのまま$param[0], $param[1]...として使用できます。 しかし、私はあなたに同意する、それはちょっと変わって見て醜いです。

PHP5+がある場合はReflectionClassがありますが、CodeIgniterのソースコードを編集してこの機能を実装する必要があります。あなたが探している機能はReflectionClass::newInstance()で、hereが見つかります。

+0

リフレクションクラスで何ができますか? –

+0

@ Truth、あなたは新しいクラスを呼び出して、コンストラクタに引数を渡すことができると述べました。ここでは 'ReflectionClass :: newInstance()'に関するドキュメントを読むだけでいいです。 – Shoe

1

loaderクラスを別の方法で変更しない限り、私はCodeIgniterの経験から、あなたが知っている通り、application/core/フォルダにはカスタムクラスを実装する必要があります)方法はありません(私が知っているものはありません)

多くの外部ライブラリ(ほとんどがapi sdksまたはsparks)を使用しています。自分の設定ファイルをビルドするのが好きで、呼び出されたときにライブラリにロードされる値を設定する場所があります。私の必要に応じて単純または多次元の$params = array()を作成し、ライブラリ内でそれを使用します。

私が知っている短い答えでは、$this->load->library('lib_name', $params)しかありません。

1

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(); 

Codeigniters Loaderクラスを使用してライブラリをロードした場合と同じです。

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

個人的には、内容を検証する必要があるため、私のクラスに配列を渡すのが嫌いです。パラメータが__construct()に個別に渡されるとき、PHPはこれを処理します。

-1

これが最善の方法である:使用$this->upload->initialize($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; 
0

大きな配列を作成$this->load->library('upload', $configUpload);

関連する問題