﻿
<h1 class=p1>Определения и вызовы функций</h1>
<br>
<br>

<p class=text>Функция объявляется при помощи ключевого слова <b>function</b>, после которого в фигурных скобках записываются различные операторы, составляющие тело функции:</p>
<blockquote><pre>
<em class=gr>function</em> <b>MyFunction</b><em class=gr>()</em>
<em class=gr>{</em>
<em class=comnt> // операторы</em>
<em class=gr>}</em>
</pre></blockquote>
<p class=text>Если функция принимает аргументы, то они записываются как переменные в объявлении функции. <b>Аргумент функции</b> представляет собой переменную, передаваемую в тело функции для дальнейшего использования в операциях. В случае, когда функция принимает больше одного аргумента, эти переменные разделяются запятыми:</p>
<blockquote><pre>
<em class=gr>function</em> <b>MyFunction</b><em class=gr>(</em><b>$var, $var1, $var2</b><em class=gr>)</em>
</pre></blockquote>
<p class=text>Если функция возвращает какое-либо значение, в теле функции обязательно должен присутствовать оператор <b>return:</b></p>
<blockquote><pre>
<em class=gr>function</em> <b>MyFunction</b><em class=gr>()</em>
<em class=gr>{</em>
  <em class=gr>return</em> <b>$ret</b><em class=gr>;</em><em class=comnt> // возвращается значение переменной $ret</em>
<em class=gr>}</em>
</pre></blockquote>
<p class=text>Пример простой функции.</p>
<blockquote><pre>
<em class=red>&lt;?</em>
  <em class=gr>function</em> <b>get_sum</b><em class=gr>()</em>
  <em class=gr>{</em>
    <b>$var</b><em class=gr> = </em>5<em class=gr>;</em>
    <b>$var1</b><em class=gr> = </em>10<em class=gr>;</em>
    <b>$sum</b><em class=gr> = </em><b>$var</b><em class=gr> + </em><b>$var1</b><em class=gr>;</em>
    <em class=gr>return</em> <b>$sum</b><em class=gr>;</em>
  <em class=gr>}</em>
  <em class=gr>echo(</em><b>get_sum</b><em class=gr>());</em><em class=comnt> // выводит 15</em>
<em class=red>?&gt;</em>
</pre></blockquote>

<p class=text>В этом примере показана функция, вычисляющая сумму двух чисел. Эта функция не принимает ни одного аргумента, а просто вычисляет сумму и возвращает полученный результат. После этого, она вызывается в теле оператора <b>echo</b> для вывода результата в браузер. Модифицируем эту функцию так, чтобы она не возвращала полученный результат, а выводила его в браузер. Для этого достаточно внести оператор <b>echo</b> в тело функции:</p>
<blockquote><pre>
<em class=red>&lt;?</em>
  <em class=gr>function</em> <b>get_sum</b><em class=gr>()</em>
  <em class=gr>{</em>
    <b>$var</b><em class=gr> = </em>5<em class=gr>;</em>
    <b>$var1</b><em class=gr> = </em>10<em class=gr>;</em>
    <b>$sum</b><em class=gr> = </em><b>$var</b><em class=gr> + </em><b>$var1</b><em class=gr>;</em>
    <em class=gr>echo</em> <b>$sum</b><em class=gr>;</em>
  <em class=gr>}</em>
  <b>get_sum</b><em class=gr>();</em>
<em class=red>?&gt;</em>
</pre></blockquote>

<p class=text>Переменные <b>$var</b> и <b>$var1</b> мы можем объявить как аргументы и в этом случае в теле функции их определять не надо:</p>
<blockquote><pre>
<em class=red>&lt;?</em>
  <em class=gr>function</em> <b>get_sum</b><em class=gr>(</em><b>$var, $var1</b><em class=gr>)</em>
  <em class=gr>{</em>
    <b>$sum</b><em class=gr> = </em><b>$var</b><em class=gr> + </em><b>$var1</b><em class=gr>;</em>
    <em class=gr>echo</em> <b>$sum</b><em class=gr>;</em>
  <em class=gr>}</em>
  <b>get_sum</b><em class=gr>(</em>5,2<em class=gr>);</em><em class=comnt> // выводит 7</em>
<em class=red>?&gt;</em>
</pre></blockquote>

<p class=text>Переменная, содержащая значение, переданное через аргумент, называется <b>параметром</b> функции.</p>
<p class=text>В рассмотренных примерах аргументы функции передаются по значению, т. е. значения параметров изменяется только внутри функции, и эти изменения не влияют на значения переменных за пределами функции:</p>

<blockquote><pre>
<em class=red>&lt;?</em>
  <em class=gr>function</em> <b>get_sum</b><em class=gr>(</em><b>$var</b><em class=gr>)</em><em class=comnt> // аргумент передается по значению</em>
  <em class=gr>{</em>
    <b>$var</b><em class=gr> = </em><b>$var</b><em class=gr> + </em>5<em class=gr>;</em>
    <em class=gr>return</em> <b>$var</b><em class=gr>;</em>
  <em class=gr>}</em>
  <b>$new_var</b><em class=gr> = </em>20<em class=gr>;</em>
  <em class=gr>echo(</em><b>get_sum</b><em class=gr>(</em><b>$new_var</b><em class=gr>));</em><em class=comnt> // выводит 25</em>
  <em class=gr>echo(</em>&quot;&lt;br&gt;<b>$new_var</b>&quot;<em class=gr>);</em><em class=comnt> // выводит 20</em>
<em class=red>?&gt;</em>
</pre></blockquote>

<p class=text>Для того чтобы переменные переданные функции сохраняли свое значение при выходе из нее, применяется передача параметров по ссылке. Для этого перед именем переменной необходимо поместить амперсанд (<b>&</b>):</p>
<blockquote><pre>
  <em class=gr>function</em> <b>get_sum</b><em class=gr>(</em><b>$var, $var1, &$var2</b><em class=text>)</em>
</pre></blockquote>

<p class=text>В этом случае переменные <b>$var</b> и <b>$var1</b> будут переданы по значению, а переменная <b>$var2</b> - по ссылке. В случае, если аргумент передается по ссылке, при любом изменении значения параметра происходит изменение переменной-аргумента:</p>
<blockquote><pre>
<em class=red>&lt;?</em>
  <em class=gr>function</em> <b>get_sum</b><em class=gr>(</em><b>&$var</b><em class=gr>)</em><em class=comnt> // аргумент передается по ссылке</em>
  <em class=gr>{</em>
    <b>$var</b><em class=gr> = </em><b>$var</b><em class=gr> + </em>5<em class=gr>;</em>
    <em class=gr>return</em><b>$var</b><em class=gr>;</em>
  <em class=gr>}</em>
  <b>$new_var</b><em class=gr> = </em>20<em class=gr>;</em>
  <em class=gr>echo(</em>get_sum<em class=gr>(</em><b>$new_var</b><em class=gr>));</em><em class=comnt> // выводит 25</em>
  <em class=gr>echo(</em>&quot;&lt;br&gt;<b>$new_var</b>&quot;<em class=gr>);</em><em class=comnt> // выводит 25</em>
<em class=red>?&gt;</em>
</pre></blockquote>
