Я долго думал о том, как справиться с такой ситуацией:
Возьмем, к примеру, пример хеша:
hash = {'a' => 'b', 'c' => 'd'}
other = {'a' => 'd'}
hash.merge(other) # returns a new hash
hash.merge!(other) # modifies hash
Как бы вы справились с этим в php?
$hash = new Hash(array( 'a' => 'b', 'c' => 'd' ));
$other = new Hash(array('a' => 'd'));
Опция params:
public function merge($other, array $options = array('mutate' => false))
{
}
// or
public function merge($other, $mutate = false)
{
}
Или, возможно, два разных имени метода:
public function merge($other)
{
}
public function mergeIntoSelf($other)
{
}
Мне нравится подход ‘param параметров’, но что, если метод на самом деле получает другой необязательный параметр, например, в ruby, который является обратным вызовом модификатора.
$hash->merge($other, function ($key, $originalValue, $otherValue) {
if ($key === 'foo') {
return $originalValue;
}
return $otherValue;
}, array('mutate' => true));
Опция обратного вызова может быть третьей, а не второй, но мне это не нравится. Мне также не нравится идея проверять параметры и пытаться выяснить, что к чему. У них блок документов становится волосатым.
Поэтому я хотел бы услышать ваше мнение о том, как вы к этому подойдете.
Заранее спасибо.
Ты можешь использовать &
знак в имени функции, но это не хорошее решение. я хочу просто дать представление о том, что это возможно:
$a = array( 'a' => 'b', 'c' => 'd' );
$b = array('a' => 'd');
function mergeArray(& $a,$b) {
return $a = array_merge($a,$b);
}
$c = mergeArray($a,$b);
var_dump($a);
var_dump($c);
Вы можете видеть, что $ c и $ a будут одинаковыми.
Других решений пока нет …