Пользовательские функции в PHP (Часть 3)
Cтатические переменные
Помимо локальных и глобальных переменных, в PHP существует еще один тип переменных - статические переменные.
Если в теле пользовательской функции объявлена статическая переменная, то компилятор не будет ее удалять после завершения работы функции. Пример работы пользовательской функции, содержащей статические переменные:
<?php
function funct()
{
static $a;
$a++;
echo "$a";
}
for ($i = 0; $i++<10;) funct();
?>
Данный сценарий выводит строку:
1 2 3 4 5 6 7 8 9 10
Если мы удалим инструкцию static, будет выведена строка:
1 1 1 1 1 1 1 1 1 1
Это связано с тем, что переменная $a будет удаляться при завершении работы функции и обнуляться при каждом ее вызове. Переменная $a инкрементируется сразу после обнуления, а только потом выводится.
Рекурсивные функции
Рекурсивные функции - это функции, вызывающие самих себя. Такой вызов называется рекурсивным. Рекурсия бывает:
Рассмотрим пример рекурсивной функции (прямой), используемой при вычислении факториала x! :
<?php
function factorial($x) {
if ($x === 0) return 1;
else return $x*factorial($x-1);
}
echo factorial(7);
?>
В рассмотренном примере пользовательская функция factorial() вызывает сама себя, что является прямой рекурсией.
Непрямая рекурсия возникает, когда первая функция вызывает вторую, а вторая - первую.
При создании рекурсивных функций необходимо соблюдать осторожность, стараясь избегать зацикливания.
Вот пример неправильного использования рекурсивной функции:
<?php
function factorial($x) {
if ($x === 0) return 1;
else return $x*factorial($x);
}
?>
Условно определяемые функции
PHP позволяет, в зависимости от определенных факторов, одной и той же функции выполнять различные действия. Рассмотрим пример:
<?php
$phpver = phpversion();
if ($phpver[0] === "5")
{
function getversion() { return "Вы используете PHP5"; }
}
if ($phpver[0] === "4")
{
function getversion() { return "Вы используете PHP4"; }
}
if ($phpver[0] === "3")
{
function getversion() { return "Вы используете PHP3"; }
}
echo @getversion();
?>
Рассмотренный скрипт выводит версию используемого интерпретатора PHP. Одна и та же функция getversion() может возвращать различный результат, в зависимости от значения переменной $phpver.
Возврат функцией ссылки
Рассмотрим еще одну возможность пользовательских функций PHP - возврат ссылок. Приведем конкретный пример скрипта, использующего такую возможность:
<?php
$a = 100;
/* Далее идет функция, которая возвращает ссылку */
function &s () {
global $a;
// Возвращаем ссылку на переменную $a
return $a;
}
// Присваиваем ссылку переменной $b
$b = &s();
$b = 0;
echo $a; // Выводит 0
?>
Рассмотренный скрипт выведет 0, поскольку если вы измените значение одной из переменных ($a или $b), автоматически будет изменено значение другой переменной. Для разрыва связи между объектом и ссылкой, используйте оператор UnSet(). Подробнее о ссылках можно узнать здесь.
Смотрите также:
Глобальные переменные в PHP