私はCodeIgniter用のライブラリを作成しています。異なるタイプの複数のパラメータ(PDOオブジェクト、ユーザ名とパスワード、設定など)を渡したいと思います。CodeIgniterで複数のパラメータをライブラリに渡すには?
私はこれらのすべての配列を渡すことができますが、それは($params
が何が必要なのかを記述することができないため)最善の方法ではないようです。
複数のパラメータをライブラリに渡すにはどうすればよいですか?
ありがとうございます。
私はCodeIgniter用のライブラリを作成しています。異なるタイプの複数のパラメータ(PDOオブジェクト、ユーザ名とパスワード、設定など)を渡したいと思います。CodeIgniterで複数のパラメータをライブラリに渡すには?
私はこれらのすべての配列を渡すことができますが、それは($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 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本当に何が壊れるかわからないが、何かがあるとほとんど確実に言える。それは本当にリスクに値するものではありません。私は強く上記の最初のアプローチをお勧めします。
乾杯!
デフォルトでは、CodeIgniterではできません。ライブラリクラスには1つのパラメータしか渡すことができません。前述のように、paramは他のすべてのパラメータを含む配列になる可能性があり、そのまま$param[0], $param[1]...
として使用できます。 しかし、私はあなたに同意する、それはちょっと変わって見て醜いです。
PHP5+
がある場合はReflectionClassがありますが、CodeIgniterのソースコードを編集してこの機能を実装する必要があります。あなたが探している機能はReflectionClass::newInstance()
で、hereが見つかります。
リフレクションクラスで何ができますか? –
@ Truth、あなたは新しいクラスを呼び出して、コンストラクタに引数を渡すことができると述べました。ここでは 'ReflectionClass :: newInstance()'に関するドキュメントを読むだけでいいです。 – Shoe
loader
クラスを別の方法で変更しない限り、私はCodeIgniterの経験から、あなたが知っている通り、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();
Codeigniters Loaderクラスを使用してライブラリをロードした場合と同じです。
$this->load->library('some_class')
$this->Some_class->do_something();
個人的には、内容を検証する必要があるため、私のクラスに配列を渡すのが嫌いです。パラメータが__construct()に個別に渡されるとき、PHPはこれを処理します。
これが最善の方法である:使用$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;
大きな配列を作成$this->load->library('upload', $configUpload);
後、私は、あなたが「ライブラリ」を言うときに、あなたがクラスをインスタンス化する際のパラメータを渡す意味ですかCodeIgniterのを使用していませんでした? –
はい、通常は '$ this-> load-> library( 'lib_name'、$ params)'で行いますが、複数の '$ param'を渡したいと思います。 –
配列に問題がありますか? $ params = array(...) –