p align="left">Функция вычисления факториала натурального числа <?php function fact($n){ if ($n==0) return 1; else return $fact = $n * fact($n-1); } echo fact(3); // можно было бы написать echo (3*2); // но если число большое, echo fact(50); // то удобнее пользоваться функцией, // чем писать echo (50*49*48*...*3*2); ?> Таким образом, когда мы осуществляем действия, в которых прослеживается зависимость от каких-то данных, и при этом, возможно, нам понадобится выполнять такие же действия, но с другими исходными данными, удобно использовать механизм функций - оформить блок действий в виде тела функции, а меняющиеся данные - в качестве ее параметров. Посмотрим, как в общем виде выглядит задание (объявление) функции. Функция может быть определена с помощью следующего синтаксиса: function Имя_функции (параметр1, параметр2, ... параметрN){ Блок_действий return "значение возвращаемое функцией"; } Если прямо так написать в php-программе, то работать ничего не будет. Во-первых, Имя_функции и имена параметров функции (параметр1, параметр2 и т.д.) должны соответствовать правилам наименования в PHP (и русских символов в них лучше не использовать). Имена функций нечувствительны к регистру. Во-вторых, параметры функции - это переменные языка, поэтому перед названием каждого из них должен стоять знак $. Никаких троеточий ставить в списке параметров нельзя. В-третьих, вместо слов блок_действий в теле функции должен находиться любой правильный PHP-код (не обязательно зависящий от параметров). И наконец, после ключевого слова return должно идти корректное php-выражение (что-либо, что имеет значение). Кроме того, у функции может и не быть параметров, как и возвращаемого значения. Пример правильного объявления функции - функция вычисления факториала, приведенная выше. Как происходит вызов функции? Указывается имя функции и в круглых скобках список значений ее параметров, если таковые имеются: <?php Имя_функции ("значение_для_параметра1", "значение_для_параметра2",...); // пример вызова функции - вызов функции // вычисления факториала приведен выше, // там для вычисления факториала числа 3 // мы писали: fact(3); // где fact - имя вызываемой функции, // а 3 - значение ее параметра с именем $n ?> Когда можно вызывать функцию? Казалось бы, странный вопрос. Функцию можно вызвать после ее определения, т.е. в любой строке программы ниже блока function f_name(){...}. В PHP3 это было действительно так. Но уже в PHP4 такого требования нет. Все дело в том, как интерпретатор обрабатывает получаемый код. Единственное исключение составляют функции, определяемые условно (внутри условных операторов или других функций). Когда функция определяется таким образом, ее определение должно предшествовать ее вызову. <? $make = true; /* здесь нельзя вызвать Make_event(); потому что она еще не существует, но можно вызвать Save_info() */ Save_info("Вася","Иванов", "Я выбрал курс по PHP"); if ($make){ // определение функции Make_event() function Make_event(){ echo "<p>Хочу изучать Python<br>"; } } // теперь можно вызывать Make_event() Make_event(); // определение функции Save_info function Save_info($first, $last, $message){ echo "<br>$message<br>"; echo "Имя: ". $first . " ". $last . "<br>"; } Save_info("Федя","Федоров", "А я выбрал Lisp"); // Save_info можно вызывать и здесь ?> Пример 5.1. Определение функции внутри условного оператора Если функция однажды определена в программе, то переопределить или удалить ее позже нельзя. Несмотря на то, что имена функций нечувствительны к регистру, лучше вызывать функцию по тому же имени, каким она была задана в определении. <?php /* нельзя сохранить данные, т.е. вызвать функцию DataSave() до того, как выполнена проверка их правильности, т.е. вызвана функция DataCheck() */ DataCheck(); DataSave(); function DataCheck(){ // проверка правильности данных function DataSave(){ // сохраняем данные } } ?> Пример 5.2. Определение функции внутри функции Рассмотрим подробнее аргументы функций, их назначение и использование. Аргументы функций У каждой функции может быть, как мы уже говорили, список аргументов. С помощью этих аргументов в функцию передается различная информация (например, значение числа, факториал которого надо подсчитать). Каждый аргумент представляет собой переменную или константу. С помощью аргументов данные в функцию можно передавать тремя различными способами. Это передача аргументов по значению (используется по умолчанию), по ссылке и задание значения аргументов по умолчанию. Рассмотрим эти способы подробнее. Когда аргумент передается в функцию по значению, изменение значения аргумента внутри функции не влияет на его значение вне функции. Чтобы позволить функции изменять ее аргументы, их нужно передавать по ссылке. Для этого в определении функции перед именем аргумента следует написать знак амперсанд «&». <?php // напишем функцию, которая бы добавляла // к строке слово checked function add_label(&$data_str){ $data_str .= "checked"; } $str = "<input type=radio name=article "; // пусть имеется такая строка echo $str ."><br>"; // выведет элемент формы - // не отмеченную радио кнопку add_label($str); // вызовем функцию echo $str ."><br>"; // это выведет уже отмеченную // радио кнопку ?> Пример 5.3. Передача аргументов по ссылке В функции можно определять значения аргументов, используемые по умолчанию. Само значение по умолчанию должно быть константным выражением, а не переменной и не представителем класса или вызовом другой функции. У нас есть функция, создающая информационное сообщение, подпись к которому меняется в зависимости от значения переданного ей параметра. Если значение параметра не задано, то используется подпись "Оргкомитет". <?php function Message($sign="Оргкомитет"){ // здесь параметр sign имеет по умолчанию // значение "Оргкомитет" echo "Следующее собрание состоится завтра."; echo "$sign .<br>"; } Message(); // вызываем функцию без параметра. // В этом случае подпись - это Оргкомитет Message("С уважением, Вася"); // В этом случае подпись // будет "С уважением, Вася" ?> Пример 5.4. Значения аргументов по умолчанию Результатом работы этого скрипта будет: Следующее собрание состоится завтра. Оргкомитет. Следующее собрание состоится завтра. С уважением, Вася. Если у функции несколько параметров, то те аргументы, для которых задаются значения по умолчанию, должны быть записаны после всех остальных аргументов в определении функции. В противном случае появится ошибка, если эти аргументы будут опущены при вызове функции. Например, мы хотим внести описание статьи в каталог. Пользователь должен ввести такие характеристики статьи, как ее название, автор и краткое описание. Если пользователь не вводит имя автора статьи, считаем, что это Иванов Иван. <?php function Add_article($title, $description, $author="Иванов Иван"){ echo "Заносим в каталог статью: $title,"; echo "автор $author"; echo "<br>Краткое описание: "; echo "$description <hr>"; } Add_article("Информатика и мы", "Это статья про информатику ...", "Петров Петр"); Add_article("Кто такие хакеры", "Это статья про хакеров ..."); ?> В результате работы скрипта получим следующее Заносим в каталог статью: Информатика и мы, автор Петров Петр. Краткое описание: Это статья про информатику... Заносим в каталог статью: Кто такие хакеры, автор Иванов Иван. Краткое описание: Это статья про хакеров... Если же мы напишем вот так: <?php function Add_article($author="Иванов Иван", $title, $description){ // ...действия как в предыдущем примере } Add_article("Кто такие хакеры", "Это статья про хакеров..."); ?> То в результате получим: Warning: Missing argument 3 for add_article() in c:\users\nina\tasks\func\def_bad.php on line 2 Возвращаемые значения Все функции, приведенные выше в качестве примеров, выполняли какие-либо действия. Кроме подобных действий, любая функция может возвращать как результат своей работы какое-нибудь значение. Это делается с помощью утверждения return. Возвращаемое значение может быть любого типа, включая списки и объекты. Когда интерпретатор встречает команду return в теле функции, он немедленно прекращает ее исполнение и переходит на ту строку, из которой была вызвана функция. Например, составим функцию, которая возвращает возраст человека. Если человек не умер, то возраст считается относительно текущего года. <?php /* если второй параметр вычисляется как true, то он рассматривается как дата смерти, */ function Age($birth, $is_dead){ if ($is_dead) return $is_dead-$birth; else return date("Y")-$birth; } echo Age(1971, false); // выведет 33 echo Age(1971, 2001); // выведет 30 ?> В этом пример можно было и не использовать функцию return, а просто заменить ее функцией вывода echo. Однако если мы все же делаем так, что функция возвращает какое-то значение (в данном случае возраст человека), то в программе мы можем присвоить любой переменной значение этой функции: $my_age = Age(1981, 2004); В результате работы функции может быть возвращено только одно значение. Несколько значений можно получить, если возвращать список значений (одномерный массив). Допустим, мы хотим получить полный возраст человека с точностью до дня. <?php function Full_age($b_day, $b_month, $b_year){ if (date("m")>$b_month && date("d")>$b_day) { $day = date ("d") - $b_day; $month = date("m") - $b_month; $year = date("Y") - $b_year; } else { $year = date("Y") - $b_year - 1; $day = 31 - ($b_day - date ("d")); $month = 12 - ($b_month - date("m")); } return array ($day,$month,$year); } $age = Full_age("07","08","1974"); echo "Вам $age[2] лет, $age[1] месяцев и $age[0] дней"; // выведет "Вам 29 лет, 11 месяцев и 5 дней" ?> Когда функция возвращает несколько значений для их обработки в программе, удобно использовать языковую конструкцию list(), которая позволяет одним действием присвоить значения сразу нескольким переменным. Например, в предыдущем примере, оставив без изменения функцию, обработать возвращаемые ей значения можно было так: <? // задание функции Full_age() list($day,$month,$year) = Full_age("07", "08","1974"); echo "Вам $year лет, $month месяцев и $day дней"; ?> Вообще конструкцию list() можно использовать для присвоения переменным значений элементов любого массива.
Страницы: 1, 2, 3, 4
|