Функция PHP — это конструкция, которая позволяет оформить блок програмного кода для многократного использования. Такой блок (тело функции) можно озоглавить путем назначения ему имени и указать при необходимости параметры (значения переменных и выражений), с которыми он будет работать. В отличие от других языков программирования, функцию можно задавать не только в определенном месте программы, но и прямо среди других операторов.
Пользовательские функции PHP. Общий синтаксис определения функции
Пользовательские функции — это функции, которые определяются программистом. Создать функцию означает написать в програмном коде ее определение: имя, список параметров(не обязательно), и програмный код (тело функции), который будет выполнен при вызове этой функции.
Определение (описание) функции начинается ключевым словом function
. Описание функции имеет следующий синтаксис:
function имя_функции (параметры) {
код
}
Имя функции выбирается так же, как и имя переменной, за исключением того, что недопустимо первым символом в имени функции использовать символ $
. Недопустимо также использовать в качестве имени ключевые слова языка РНР. За именем функции обязательно стоит пара круглых скобок ()
. Програмный код (тело) функции заключается в фигурные скобки {}
. Они определяют группу выражений, которые относятся к коду именно этой функции. Если функция принимает параметры, то список их имен (идентификаторов) указывается в круглых скобках около имени функции. Имена параметров выбираются согласно тем же требованиям, что и имена обычных переменных. Если параметров несколько, то в списке они разделяются запятыми. Если параметры для данной функции не предусмотрены, то в круглых скобках около имени ничего не пишут.
Инструкция return
Если требуется, чтобы функция возвращала некоторое значение, то в ее теле {}
используется оператор возврата return
с указанием справа от него, что следует возвратить. В качестве возвращаемой величины может выступать любое выражение: простое значение, имя переменной или вычисляемое выражение. Оператор return
может встречаться в коде функции несколько раз. Если оператор return
не использовать или не указывать справа от него возвращаемую величину, то функция ничего возвращать не будет.
Пример:
<?php
function mySr($w,$h){
$S=$w*$h;
return $S;
}
echo mySr(5,4); //выводит 20
?>
Здесь функция mySr принимает два параметра — $w
и $h
, вычисляет и возвращает произведение их значений.
Определение функции, будучи помещенным в программу, усваивается интерпретатором, но сама функция (ее код и тело) не выполняются. Чтобы выполнить функцию, определение которой задано, необходимо написать в программе выражение вызова этой функции mySr(5,4)
.
Имя функции в ее вызове должно совпадать с именем ранее определенной функции. Совпадение с точностью до регистра не обязательно. Например, выражения MySr(), mYsR(), MYsr(), mysR()
эквивалентны.
Параметры по умолчанию
Параметры функции могут быть переданы по значению и по ссылке. По умолчанию они передаются по значению. Это означает, что изменение в теле функции значения переменной, переданной в качестве параметра, ни как не отразится на значении этой же переменной во внешнем коде. Кроме того, любая переменная, созданная в теле функции, является локальной, т.е. видимой только в пределах ее кода.
Пример:
<?php
$x=5;
function mySn($a){
$a=$a+4;
$y=10;
return $a;
}
echo mySn($x); //возвращает 9
echo "<br>";
echo $x; //выводит 5(прежднее значение)
echo "<br>";
echo $y; /*ничено не выводится, т.к. значение $y вне функции mySn() равно null*/
?>
При передаче параметров по значению в функции создаются локальные переменные с такими же именами, что и имена формальных параметров, указанных в определении функции. Это локальные переменные, отличные от внешних, даже если их имена совпадают. Приведенный ниже код эквивалентен приведенному выше.
<?php
$x=5;
function mySn($x){
$x=$x+4;
$y=10;
return $x;
}
echo mySn($x); //возвращает 9
echo "<br>";
echo $x; //выводит 5(прежднее значение)
echo "<br>";
echo $y; /*ничено не выводится, т.к. значение $y вне функции mySn() равно null*/
?>
Передача параметров по ссылке
Чтобы изменения параметров, произведенных в теле функции, были видны и за пределами ее тела, необходимо передать их по ссылке. Для указания того, что параметр передается по ссылке, перед его именем в списке параметров в определении функции следует написать символ &(амперсанд)
:
function имя_функции($arg1, $arg2, . . . ){
код
}
Пример:
<?php
$x=5;
function mySn(&$arg){
$arg=$arg+4;
return $arg;
}
echo mySn($x); //возвращает 9
echo "<br>";
echo $x; //выводит 9(новое значение)
?>
Переменное число параметров
При передаче функции большого количества параметров, чем их предусмотрено в определении, лишние параметры будут просто проигнорированы. Если передается меньшее количество, то пропущенным параметрам присваивается значение null и при этом может быть выведено соответствующее предупредительное сообщение, что в конечном итоге не приведет к остановке выполнения кода. Вместе с тем, в определении функции можно указать значение параметров, принимаемые по умолчанию. Для задания значений по умолчанию используется оператор присваивания непосредственно в списке формальных параметров определения функции.
Пример:
<?php
function Srec($w=10,$h=5){
$S=$w*$h;
return $S;
}
echo Srec() ; //возвращает 50
echo "<br>";
echo Srec(6); //возвращает 30
?>
Внимание! При задании параметров в определении функций значений по умолчанию, последние должны быть простыми значениями, а не переменными, вычисляемыми выражениями или вызовами функций и методов объектов.
Если в списке используются параметры без значений по умолчанию, а также параметры с заданными значениями по умолчанию, то последние должны располагаться в правой части списка, т.е. за теми параметрами, для которых значения по умолчанию не предусмотрены.
При создании функций, способных работать с переменными по длине списком параметров, можно применить следующие встроенные функции:
func_num_args()
— возвращает количество параметров, переданных функции, из которой она была вызвана.-
Пример:
<?php
function Srec(){
if (func_num_args()= =0){ //если нет параметоров
$w=10;
$h=5;
}
if (func_num_args()= =1){//если один параметр
$h=5;
}
return $w*$h ;
}
echo Srec() ; //возвращает 50
echo "<br>";
echo Srec(6); //возвращает 0
?> func_get_args()
— возвращает массив значений параметров, переданных функции, из кторой она была вызвана.-
Пример:
<?php
function Srec(){
/*значения параметров по умолчанию: */
$w=10;
$h=5;
$args=func_get_args(); //массив значений параметров
$narg=count(func_get_args());//длина массива значений параметров
if ($narg= =1) $w = $args[0];
if ($narg==2) { //если два параметра
$w=$args[0];
$h=$args[1];
}
return $w*$h;
}
echo Srec() ; //возвращает 50
echo "<br>";
echo Srec(6); //возвращает 30
echo "<br>";
echo Srec(6,4); //возвращает 24
?> func_get_arg(номер параметра)
— возвращает значение параметра, указанного с помощью его номера. Если номер_параметра превышает длину списка переданных параметров, то данная функция возвращаетfalse
. Обычно эта функция используется совместно сfunc_num_args()
иfunc_get_args()
.-
Пример:
<?php
function Srec(){
echo "w=".func_get_arg(0)."h=".func_get_arg(1);
}
echo Srec() ; //w = h
echo "<br>";
echo Srec(2); // w = 2 h =
echo "<br>";
echo Srec(6,4); // w = 6 h = 4
?>Пример использования двух функций:
<?php
function myRec()
{ for($i=0; $i<func_num_args(); $i++) {
for($j=0; $j<$i; $j++) ;
echo func_get_arg($i)."<br>\n"; // выводим элемент
}
}
// отображаем строки
echo myRec("Меркурий", "Венера", "Земля", "Марс");
?>В окне веб-браузера это будет выглядеть ТАК.
Обратите внимание на то, что при описании
Srec()
иmyRec()
мы указали пустые скобки в качестве списка параметров, словно функции не получает ни одного параметра. На самом деле в PHP при вызове функции можно указывать параметров больше, чем задано в списке аргументов — в этом случае никакие предупреждения не выводятся (но если фактическое число параметров меньше, чем указано в описании, PHP выдаст сообщение об ошибке). "Лишние" параметры как бы игнорируются, в результате пустые скобки вSrec()
иmyRec()
позволяют нам в действительности передать им сколько угодно параметров.
Локальные переменные PHP
Наконец-то мы подошли вплотную к вопросу о "жизни и смерти" переменных. Действительно, во многих приводимых выше примерах мы рассматривали параметры функции (передаваемые по значению, а не по ссылке) как некие временные объекты, которые создаются в момент вызова и исчезают после окончания функции.
Пример:
<?php
$a=100; // глобальная переменная, равная 100
function test($a)
{ echo $a;/* выводим значение параметра $a. Этот параметр не имеет к глобальной $a никакого отношения!*/
$a++; /* изменяется только локальная копия значения, переданного в $a*/
}
test(1);// выводит 1
echo "<br>";
echo $a;// выводит 100 — глобальная $a, конечно, не изменилась
?>
В действительности такими же свойствами будут обладать не только аргументы, но и все другие переменные, инициализируемые или используемые внутри функции.
Пример:
<?php
function Str_t()
{ $i=rand();// записывает в $i случайное число
echo $i;/* выводит его на экран. Эта $i не имеет к $i цикла никакого отношения */
}
for($i=0; $i!=10; $i++) Str_t();
?>
Здесь переменная $i
в функции будет не той переменной $i
, которая используется в программе для организации цикла. Поэтому, собственно, цикл и проработает только 10 "витков", напечатав 10 случайных чисел (а не будет крутиться долго и упорно, пока "в рулетке" функции rand()
не выпадет 10.
Глобальные переменные PHP
В PHP есть способ, посредством которого функции могут добраться и до любой глобальной переменной в программе (не считая, конечно, передачи параметра по ссылке). Однако для этого они должны проделать определенные действия, а именно: до первого использования в своем теле внешней переменной объявить ее "глобальной".
Пример:
<?php
function Str_t() {
global $i;
$i=rand();
echo $i;
}
for($i=0; $i!=10; $i++) Str_t();
?>
Вот теперь-то переменная $i
будет везде едина: что в функции, что во внешнем цикле (для последнего это приведет к немедленному его "зацикливанию", во всяком случае, на ближайшие несколько минут, пока rand()
не выкинет 10). А вот еще один пример, который показывает удобство использования глобальных переменных внутри функции:
<?php
$Monthes[1]="Январь";
$Monthes[2]="Февраль";
//... и т. д.
$Monthes[12]="Декабрь";
// Возвращает название месяца по его номеру. Нумерация начинается с 1!
function GetMonthName($n){
global $Monthes;
return $Monthes[$n];
}
//. . .
echo GetMonthName(2); // выводит "Февраль"
?>
Массив $Monthes
, содержащий названия месяцев, довольно объемист
Поэтому описывать его прямо в функции было бы, мягко говоря, неудобно. В то же время функция GetMonthName()
представляет собой довольно преемлемое средство для приведения номера месяца к его словесному эквиваленту (что может потребоваться во многих программах). Она имеет единственный и понятный параметр: это номер месяца. Как бы мы это сделали без глобальных переменных?
Комментарии(0)
Для добавления комментариев надо войти в систему и авторизоватьсяКомментирование статей доступно только для зарегистрированных пользователей:Зарегистрироваться