ほとんどの回答は配列法を支持してきましたが(一般的に言えば、私も同意します)、悪魔の代弁者を演じて、いくつかの欠点を挙げます。
ドキュメントはあまり明確ではありません
関数/メソッドを文書化するほとんどのメソッドは、その関数のパラメーターを個別にリストします。たとえば、基本的なDocBlockを備えた関数は次のようになります。
/**
* A function that accepts an array of params
* @param array $param_array An array of key=>value arguments
*/
function accept_array($param_array = array('key1' => 'first_val', 'key2' => 'second_val')) {
var_dump($param_array);
}
DocBlockが$param_array
、配列全体だけでなく、の個々の部分を直接サポートしていないことに注意してください。対照的に、すべての引数を個別にリストすると、次のようになります。
/**
* A function that 'normal' params
* @param string $key1 First argument
* @param string $key2 Second argument
*/
function accept_normal($key1 = 'first_val', $key2 = 'second_val') {
echo $key1;
echo $key2;
}
これは、関数がかなり自己文書化されることを期待する場合にも問題になります。最初の例では、関数自体に期待される引数を実際にリストする必要がないためです。
デフォルト値が期待どおりに機能しない場合があります
「期待どおり」はおそらく少しロードされたフレーズです(そしてこれはおそらくより明白な問題の1つです)が、次のことを取ります:
function accept_array($param_array = array('key1' => 'first_val', 'key2' => 'second_val')) {
var_dump($param_array);
}
accept_array(array('key2' => 'a_different_val'));
var_dumpにのデフォルト値key1
との新しい値が含まれることを期待する人もいるかもしれませんkey2
が、配列全体が置き換えられます。つまり、次のように、各関数で各キーのデフォルト値を手動で設定することを忘れないでください。
function accept_array($param_array = array()) {
if (!isset($param_array['key1'])) { $param_array['key1'] = 'first_val'; }
if (!isset($param_array['key2'])) { $param_array['key2'] = 'second_val'; }
var_dump($param_array);
}
accept_array(array('key2' => 'a_different_val'));
自動フィルタリングなし
引数を「通常の」方法でリストすると、組み込みのフィルターセットも提供されます。たとえば、この迅速で汚いユーザー検索を見てください。
/**
* We want to allow searching for users by user_id or email only!
* @param array $param_array
*/
function find_user($param_array = array('user_id' => 0, 'email' => '')) {
foreach ($param_array as $field => $value) {
$this->db->or_where($field, $value);
}
$this->db->get('users');
}
find_user(array('first_name' => 'Joe', 'last_name' => 'Bloggs'));
にいくつかの「受け入れられたキー」タイプの検証を手動で追加しなくても、関数$param_array
の呼び出しは基本的に好きなフィールドを使用できます。find_user()
より単純なバージョンは明らかに次のようになります。
/**
* We want to allow searching for users by user_id or email only!
* @param int $user_id
* @param string $email
*/
function find_user($user_id = 0, $email = '') {
$this->db->or_where('user_id', $user_id);
$this->db->or_where('email', $email);
$this->db->get('users');
}
// No way for me to submit any other fields, they'll just fail when they get to the query
find_user('Joe', 'Bloggs'));
私はこれらのいくつかが少しエントリーレベルであることを受け入れます、そしておそらく私が逃したものはもっとたくさんあります(もっとコメントしてください、そして私はそれらをクレジットで返信にコピーします)、しかしうまくいけば人々に二度考えさせるのに十分です手動の検証や文書化などを考慮せずに、「配列メソッド」を自動的に使用します。