Я не большой программист, но много раз слушаю от программистов, что мы всегда должны возвращать значения из функции. Я хочу знать причину.
Функция не должна возвращать ничего … Если вы посмотрите на функцию C (++), многие из них не (ну, не явно):
void nonReturningFunction(const int *someParam); int main() { int i = 12; nonReturningFunction(&i); return 0; } void nonReturningFunction(const int *someParam) { printf("I print the value of a parameter: %d",someParam); }
Последний ничего не возвращает, ну, он возвращает пустоту. Основная функция возвращает что-то: 0
, это, как правило, сигнал системе, чтобы он знал, что программа закончена, и она закончилась хорошо.
Такая же логика применяется к PHP или любому другому языку программирования. Возвращаемое значение некоторых функций релевантно, другая функция может не потребоваться, чтобы вернуть что-либо. В общих функциях возвращают значения, поскольку они имеют отношение к потоку вашей программы.
Возьмите класс, например:
<?php class Foo { private $foo,$bar; public function __construct() { $this->foo = 'bar'; } public function getFoo() { return $this->foo;//<-- getter for private variable } public function getBar() { return $this->foo;//<-- getter for private variable } public function setBar($val = null) { $this->bar = $val; return $this;//<-- return instance for fluent interfacing } public function setFoo($val = null) { $this->foo = $val; return $this; } } $f = new Foo(); $f->setFoo('foo')->setBar('bar');//<-- fluent interface echo $f->getFoo(); ?>
Если функция setter ничего не вернула, вам придется написать:
$f->setFoo('foo'); $f->setBar('Bar');
Поэтому в этом случае возвращаемые значения имеют значение. Другой пример, где они не имеют значения:
function manipulateArray(array &$arr)//<-- pass by reference { sort($arr); } $arr = range('Z','A'); manipulateArray($arr); var_dump($arr);//array is sorted
в отличие от:
function manipulateArray(array $arr)//<-- pass by copy { sort($arr); return $arr; } $arr = range('Z','A'); manipulateArray($arr); var_dump($arr);//array is not sorted! $arr = manipulateArray($arr);//<-- requires reassign
Передача по ссылке во многих случаях считается рискованной, поэтому последний подход обычно считается лучшим. Поэтому во многих случаях функции не должны возвращать значение, но они все равно, потому что это делает код более безопасным в целом.
Возможно, поэтому у вас создается впечатление, что функции всегда должны возвращать значение.
Это делается так, что существует окончательная конечная точка для функции. Это в основном повысить читаемость и помочь будущим программистам понять, что вы пытаетесь сделать.
Не должно быть предположений о том, что возвращает функция.
Это наследие старого программирования. В более старых языках, таких как Fortran, вам всегда приходилось возвращаться с чем-то вроде типа int, float, bool и т. Д. С C вы можете вернуться с типом «void», и это значение по умолчанию в большинстве функций C, если вы не указали return, он возвращается с недействительным в конце. В Java, например, вы должны указать тип возврата, а затем вернуться с этим типом. Если вы ничего не хотите возвращать, вы используете тип «void»:
//This works public void boo() { return; } //This gets you an error public int boo() { return; } //This gets you an error too, because you must specify a type for any function in Java public boo() { return; }
Так что это больше похоже на то, что сказал Ликс, если у вас есть что-то, с чем можно вернуться. В большинстве функциональных программ ваши функции могут возвращаться либо с данными, либо с истинным / ложным обозначением успеха или сбой. Во многих системах функция может возвращать int, указывающую на успех или неудачу, например «1» или «-1». Программы оболочки Unix используют это.
На других языках, таких как PHP, вам не нужно ничего возвращать, но в фоновом режиме PHP по-прежнему привязывает тип «void» как возвращаемое значение к вашей функции, вам просто не нужно явно писать его.
Надеюсь это поможет
Существует так много причин …
Это лучше для вашей архитектуры: функция принимает параметры, работает с ними и возвращает ожидаемый результат. Таким образом, вы сможете повторно использовать его и упорядочить свой код.
Это лучше для модульного тестирования , вы можете очень легко проверить, возвращает ли ваша функция ожидаемый результат.
Вообще говоря, в компьютерном программировании функция является многократно используемой единицей кода, которая принимает некоторый ввод (в том числе ничего) и возвращает значение.
Некоторые языки имеют аналогичные конструкции для функций, называемых процедурами, и это многократно используемые фрагменты кода, которые принимают некоторый ввод (в том числе ничего) и выполняют некоторую активность, но не возвращают результат.
Однако некоторые языки могут не иметь последних как синтаксическую конструкцию и использовать различные функции для реализации процедур. Таким образом, вы здесь получаете функции, в которых вы игнорируете результат. Кроме того, некоторые языки могут не требовать от фактического принудительного возврата кода из функции (т.е. они реализуют процедуры с использованием функций).
Поэтому, если у вас есть только последний, как ваш вариант, вы можете поспорить как @lix, что хорошая практика – вернуть функции из функции. Основная причина заключается в том, что, хотя функция может использоваться как процедура – вызывающий может назвать ее функцией и ожидать работы с результатом. Помните, что тестовый код является основным вариантом использования, и это может быть единственная причина для соблюдения этого соглашения.
Лично я считаю, что это ответ. Делайте все, что лучше всего подходит для вас, но старайтесь всегда делать то же самое, и если вам нужно расходиться – найдите способы, чтобы дать знать пользователю.
Также: гибкость. Рассмотрим echo
return
изнутри функции. С помощью, скажем, возвращаемого значения true
или false
из функции, вы можете изменить, как вещи отображаются в представлениях по-разному. Наличие эха в строке не дает вам такой гибкости.