Почему вы получаете ошибку:
Удалив &
из $ret
, вы больше не ссылаетесь на переменную в вызове функции. В этом случае $pieces
. Поэтому, когда вы выполните foreach
для $pieces
после вызова функции, произойдет ошибка, потому что $ куски в основном являются нулевой переменной в этой точке.
function splitSqlFile(&$ret,$sql) {
$ret[] = 'stuff';
}
splitSqlFile($pieces,$sql);
// $pieces will be an array as 0 => 'stuff'
foreach ($pieces as $piece) { } // will not error
против
function splitSqlFile($ret,$sql) {
$ret[] = 'stuff';
}
splitSqlFile($pieces,$sql);
// $pieces will be a null variable, since it was never assigned anything
foreach ($pieces as $piece) { } // will error
Альтернатива без ссылки:
Так что, если вы хотите удалить &
и больше не передавать по ссылке, вам нужно внести другие изменения в функцию, чтобы вернуть это значение обратно. И в зависимости от кодовой базы это может означать большую работу везде, где используется функция!
* * 1 022 Пример: * 1 023 *
function splitSqlFile($sql) {
$ret = [];
$ret[] = 'stuff';
return array('result'=>true,'ret'=>$ret);
}
// $result will contain multiple things to utilize
// if you will only need that variable once (does not accumulate)
$result = splitSqlFile($sql);
foreach ($result['pieces'] as $piece) { }
// if that variable is added by multiple calls, and displayed later... merge
$pieces = [];
$result = splitSqlFile($sql_1);
$pieces = array_merge($pieces,$result['pieces']);
$result = splitSqlFile($sql_2);
$pieces = array_merge($pieces,$result['pieces']);
foreach ($pieces as $piece) { }
Второй пример (передача массива по ходу дела ... сбивает с толку):
function splitSqlFile($pieces_in,$sql) {
$pieces_in[] = 'stuff';
return array('result'=>true,'pieces_out'=>$pieces_in);
}
$pieces = [];
$result = splitSqlFile($pieces,$sql_1);
$pieces = $result['pieces_out'];
$result = splitSqlFile($pieces,$sql_2);
$pieces = $result['pieces_out'];
foreach ($pieces as $piece) { }
Как вы можете видеть, он не только изменяет возвращаемые значения, с которыми нужно иметь дело, но также меняет способ его вызова. Опять же, если эта функция используется в тысяче мест в коде ... серьезные головные боли!
Вывод:
Я бы честно сохранил ссылку как есть. Это было сделано таким образом, чтобы сделать накопление отладочных данных более простым и прямым. В противном случае у вас будет много изменений кода, чтобы избавиться от ссылки.
Однако это может быть просто моим мнением по этому вопросу.