私はクラス間でいくつかの「セッター」メソッドを用意していますが、便宜上、参照で引数をとり、新しい値に置き換える前に既存の値を設定するオプションのパラメータ$previous
を追加しました。 1。例:PHPのオプション引数のテスト
public function set_value($key, $value, &$previous = null)
{
$previous = $this->get_value($key);
$this->_values[$key] = $value;
return $this;
}
これは正常です。しかし、状況によっては、対応する「ゲッター」メソッドが少しプロセス集中的で、無条件で実行することは無駄です。
if(null !== $previous)
{
$previous = $this->get_value($key);
}
これはしかし動作しない、できるだけ頻繁$previous
の引数として渡された変数は以前にそれは適用範囲だし、デフォルトとにかくnullにして定義されていない:私は、私がテストすることができ考え出し。私がハッキングた唯一の解決策は以下のとおりです。
if(array_key_exists(2, func_get_args()))
{
// ...
}
私は、引数のインデックスに依存しているメソッド本体を好きではない(それを:それは1行に
public function set_value($key, $value, &$previous = null)
{
$args = func_get_args();
if(isset($args[2])
{
$previous = $this->get_value($key);
}
$this->_values[$key] = $value;
return $this;
}
あるいは、不要だと思われます。)私はここで何を達成するためのよりクリーンな方法がありますか?
私が試してみた:
if(isset($previous)){}
if(!empty($previous)){}
if(null !== $previous){}
どちらも仕事を。
考えられる解決策これまで:
if(func_num_args() == $num_params){}
if(array_key_exists($param_index, func_get_args())){}
// 5.4
if(isset(func_get_args()[$param_index])){}
// 5.4
if(func_num_args() == (new \ReflectionMethod(__CLASS__, __FUNCTION__))
->getNumberOfParameters()){}
@DaveRandom - の分野におけるだから、何か:
define('_NOPARAM', '_NOPARAM' . hash('sha4096', microtime()));
function foo($bar = _NOPARAM)
{
// ...
}
@hoppa - ユースケース:
$obj->set_something('some_key', $some_value, $previous) // set
->do_something_that_uses_some_key()
->set_something('some_key', $previous) // and reset
->do_something_that_uses_some_key()
-> ...
の代わりに:上記のコメント/議論から抽出
$previous = $obj->get_something('some_key'); // get
$obj->set_something('some_key', $some_value) // set
->do_something_that_uses_some_key();
->set_something($previous) // and reset
->do_something_that_uses_some_key();
-> ...
の削除デフォルト値は、あなたが 'false'を(または「いくつかの値として' $のprevious'のデフォルト値を定義することができませんでした間違った "型) - それは渡された' null'であることを知っていますが、 'FALSE'(または何でも)ではありません。このメソッドにも穴があります(ユーザーがデフォルト値を渡す可能性があります)が、まともなアプローチになると思います。特に、デフォルト値に、渡された変数にない可能性が高い長いランダムな文字列を作成すると。 – DaveRandom
@DaveRandom - 状況によっては、前の値がブール値「false」になる可能性があります。私はそれが意味の意図であるために「ヌル」を選んだ、「価値の欠如」。 – Dan
長いランダムな文字列について編集したコメントを参照してください - それは美しいまたは完璧なアプローチではないと認めますが、それは作品99.99999%のアプローチです... – DaveRandom