Стиль PHP о возвращении нескольких значений - PullRequest
2 голосов
/ 09 сентября 2011

Возможно, это просто стилистический вопрос, или, возможно, есть «правильный» ответ.

Если у меня есть функция php, которая должна возвращать несколько значений (и это входящие аргументы), что является предпочтительным:

function myFuncReturnVals ($a, $b) {
 // do stuff
 return array ($a, $b)
}

function myFuncByRef (&$a, &$b) {
 // do stuff
}

list($a,$b) = myFuncReturnVals ($a,$b);
myFuncByReb($a,$b);

В любом случае, работа будет выполнена, но что предпочтительнее?

ReturnVals кажется немного чище в некоторых отношениях, так как позволяет вызывающей стороне решать, будут ли их значениябыть модифицированным.

Однако иногда ref лучше подходит, так как функция на самом деле пытается получить эти данные.

А как насчет микширования и сопоставления?Что если у вас есть функция, которая в основном отвечает за возврат некоторых данных, но в процессе может иметь дополнительную информацию о входящем параметре?

Ответы [ 2 ]

2 голосов
/ 09 сентября 2011

Я стараюсь избегать эталонных параметров, таких как чума: очевидно, что они делают в тот момент, когда вы их определяете, но большую часть времени вы будете смотреть на их использование, а там неясновообще, являются ли эти параметры побочными или побочными.

Придерживаться парадигмы возврата в виде массива более читабельно и позволяет избежать побочных эффектов;он также позволяет выполнять вызовы функций вложенности / объединения в цепочку - стиль, который выглядит следующим образом в действии:

$output = nl2br(
          detect_links(
          htmlspecialchars(
          trim($input))))

Если у вас есть несколько функций, возвращающих один и тот же тип коллекции значений, возможно, стоит обернуть ихв классе - таким образом ваше возвращаемое значение становится более информативным даже без комментариев (phpdoc), и вы сможете перехватывать неверный ввод для других функций, которые используют такие значения, добавляя подсказки типов в аргумент функции.

Также обратите внимание, что объекты уже являются ссылочными типами, поэтому передача их по ссылке имеет смысл, только если вы хотите заменить весь объект - изменение отдельных полей или вызов деструктивных методов изменят исходный объект, даже если вы передали его по значению.Пример:

<?php
class Bar {
    public $x;
    public function __construct($x) { $this->x = $x; }
}

function foo($bar, $x) {
    $bar->x = $x;
}

$myBar = new Bar(23);
$foo($myBar, 42);
printf("$foo->x is now %s\n", $foo->x);
1 голос
/ 09 сентября 2011

Вопрос выбора.Используйте метод, который соответствует вашему стилю кодирования.Я бы предпочел вернуть массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...