ресурс для начинающих веб-разработчиков
комплексные веб-услуги по созданию сайтов

Справочный материал по основным языкам программирования и верстки сайтов.

Готовая методика создания простых и сложных динамичных сайтов, с использованием PHP и MySQL.

Использование веб-редактора Adobe Dreamweaver в разработке сайтов.

Использование графических редакторов Adobe Flash, Adobe Photoshop, Adobe Fireworks в подготовке веб-графики.

Разработка веб-сайтов под "ключ".

Разработка отдельных фрагментов сайтов, консультации по вопросам верстки веб-страниц и веб-программирования.

Функции PHP. Инструкция return. Локальные переменные PHP. Глобальные переменные PHP

Функции

Функция 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() представляет собой довольно преемлемое средство для приведения номера месяца к его словесному эквиваленту (что может потребоваться во многих программах). Она имеет единственный и понятный параметр: это номер месяца. Как бы мы это сделали без глобальных переменных?