Упражнение 6. Функции. Деклариране използване. Математически функции Функции. Деклариране и използване и Упражнението има за цел да тества някои от примерите, включени в лекцията за създаването на потребителски функции в PHP. Ще припомним, че функция в PHP може да бъде декларира посредством следния синтаксис: function fname ( $arg1, $arg2…) { //оператор1; оператор2... [return израз;] } Където: fname – име на функцията, $arg1, $arg2…- списък от параметри на функцията, [return израз;] – незадължителен оператор, чрез който функцията връща стойността на израза и се прекратява изпълнението на функцията. Пример 1. Ще започнем с един пример, демонстриращ функция в PHP: "; } myCompanyMotto(); //Ние доставяме количество, не качество! ?> Пример 2: функция writeName(). Извежда: My name is Tom Taylor Запомнете: • Функцията започва с ключова дума function • Името на функцията е добре да съответства на нейното предназначение • Имената на функциите не са регистрово чувствителни, но следват същите правила като за другите имена в PHP: започват с буква или _ (но не число), следват цифри, букви или _. • Кодът е между "{" и "}" 1 За да се върне стойност от функцията, трябва да се извика return израз във функцията. Ако една функция е декларирана вътре в друга функция, то тя ще бъде достъпна само, ако външната функция се изпълни поне веднъж. Важна характеристика на функциите е, че може да им изпращате информация (чрез параметри), която те да използват. Параметрите се поставят (както знаете от езика C++) в скобите “()” и изглеждат като PHP променливи. Нека да създадем една нова функция, която създава един персонализиран поздрав, зависещ от името на потребителя. Нашият параметър ще бъде именно името на потребителя и функцията ще извежда поздрава, конкатениран с подаденото име: Пример 3: "; } myGreeting("Jack");myGreeting("Ahmed"); myGreeting("Julie");myGreeting("Charles"); ?> Изход: Hello there Jack! Hello there Ahmed! Hello there Julie! Hello there Charles! Пример 5: "; } myGreeting("Jack", "Black"); myGreeting("Ahmed", "Zewail"); myGreeting("Julie", "Roberts"); myGreeting("Charles", "Schwab"); ?> Изход: Hello there Jack Black! Hello there Ahmed Zewail! Hello there Julie Roberts! Hello there Charles Schwab! Позволена е и рекурсия при функциите на PHP, тоест функцията да извиква сама себе си. Пример за това е една функция за изчисляване на факториел на число. Тоест, ние задаваме число, а функцията връща неговия факториел. Пример 6: fact(10)=".fact(10); // то е много по-удобно да се ползва функцията, // вместо да пишем (10*9*8*...*3*2); ?> 2 Резултат: fact(3)=6 fact(10)=3628800 Забележка: • В PHP е възможно рекурсивното извикване на функции. • Избягвайте рекурсивното извикване на функция/метод с повече от 200 нива на рекурсия, тъй като това може да доведе до проблеми със стека и до прекратяване изпълнението на скрипта. Пример 7. Този пример демонстрира особеностите при деклариране на функция в условен блок: Когaто една функция е декларирана в условен блок, то нейното дефиниране трябва да предшества нейното извикване: Пример 8. I would like to study Python
"; } } /* сега може вече да извикаме Make_event(), защото Make_event()е вече дефинирана! */ Make_event(); ?> Резултат: I would like to study Python Пример 8. Ако една функция е декларирана вътре в друга функция, то тя ще бъде достъпна само ако външната функция се изпълни поне веднъж. Тъй като е дефинирана вътре във функция foo(), функция bar() не съществува, докато не се извика foo(). Иначе функциите и класовете в PHP имат глобална област на видимост - могат да бъдат извиквани и извън функцията в която са дефинирани. Functions С return можем да прекъснем изпълнението на функция: Пример 9. Hello $who"; if ($who == "Tom") { return; // Изпълнението се прекъсва, ако параметъра е “Tom” } echo ", how are you"; } hello("World"); // Отпечатва "Hello Tom" hello("Reader") // Отпечатва "Hello Reader, how are you?" ?> Предаване на параметри на функции: По стойност е подразбиращия се метод, по който фактическите параметри предават своите стойности към функцията, тоест стойностите на фактическите параметри се копират във формалните параметри; измененията на параметрите (формалните параметри) вътре във функцията не се предават извън функцията, тоест фактическите параметри не променят своята стойност; Пример 10.1: Предаване по стойност – изменението на $x се предава и извън функцията; n=".$n; //n=5 ?> Извежда се: n=5 Пример 10.2: Предаване по адрес – изменението на $x се предава и извън функцията; n=".$n; //n=6 ?> Извежда се: n=6 Връщане на резултат от функция: 4 Пример 11.1: Връщане на резултат по стойност (подразбиращ се начин на връщане на резултат) n=".$n; //n=5 ?> Извежда се: y=6 n=5 Пример 11.2: Връщане на резултат по адрес В резултат на своята работа функцията може да връща адрес на някаква променлива. За да се върне от функцията адрес, е нужно, при декларирането на функцията, да поставим пред името на функцията знак амперсанд ( & ) и всеки път когато я извикваме – пред името и, също да поставяме амперсанд ( & ). Обикновено, функцията връща адрес на някакава глобална променлива, или адрес на елемент от глобален масив, или адрес на статична променлива или адрес на един от аргументите, ако той се предаде по адрес. name is ".$name; //name is Peter echo "
name is ".$var; //name is Peter $var="Mimi"; echo "
name is ".$name; //name is Mimi // извежда 10 и 10 ?> Извежда се: name is Peter name is Peter name is Mimi Задаване на подразбиращи се стойности на параметри на функция В една функция може да се зададат подразбиращи се стойности на формалните параметри. Правилото е, ако такива има, то те да са последни в списъка с параметри. Самата подразбираща се стойност трябва да е константен израз, а не променлива, не представител на клас или извикване на друга функция. Пример 12: Задаване на подразбиращи се стойности на параметри "; 5 echo $sign . "
"; } Message(); // Извиква се функцията без параметри. // В този случай се извежда: The Rector of the TU - Varna Message("Sincerely, Your Dean."); // В този случай се извежда: Sincerely, Your Dean ?> Резултат: Dear students, welcome to the Technical University of Varna, Computer Science Department! The Rector of the TU - Varna. Dear students, welcome to the Technical University of Varna, Computer Science Department: ! Sincerely, Your Dean. Използване на подразбиращи се стойности на параметрите – ако при извикването на функцията пропуснем да зададем някой параметър, то ще се използва подразбиращата му стойност. Пример 13: От PHP 4 нататък се поддържа списък с аргументи с променлива дължина в потребителски-дефинираните функции. Това, както се вижда и от примера не изисква специален синтаксис. Чрез функцията func_num_args(), се връща броя (int) на аргументите, подадени към функцията. Чрез func_get_arg() – се извлича специфициран аргумент от списъка с аргументи на потребителси-дефинираната функция. \n"; if ($numargs >= 0) { echo "First argument is: " . func_get_arg(0) . "
\n"; } } foo (10, 12, 333); //Number of arguments: 3 //First argument is: 10 ?> Статични променливи във функциите Пример 14: Статични променливи във функциите – променливи, които запазват стойността си след изпълнение на функцията. Достъпни са само във функцията. Декларират се чрез static. "; } fn();fn();fn(); ?> Резултат: Call number = 1 Call number = 2 Call number = 3 6 Статичните променливи се инициализират само при първото изпълнение на функцията. Вградени функции Php предоставя на програмиста голям брой вградени функции, с различно предназначение, които могат да се използват навсякъде без да е необходимо да се декларират. Справочник на математическите функции може да намерите на http://www.php.net/manual/bg/ref.math.php. На http://www.php.net/manual/bg/math.constants.php можете да видите списък на предварително-дефинирани математически константи (те са част от ядрото на PHP). Ето някои от тях: abs — абсолютна стойност на число acos — Аркускосинус acosh — Хиперболичен арккосинус asin — Аркуссинус asinh — Хиперболичен аркуссинус atan2 — Аркустангенс на две променливи atan — Аркустангенс atanh — Хиперболичен аркустангенс ceil — Закръгляне на дробно число до по-голямо цяло, echo ceil(4.3); //5 cos — Косинус cosh — Хиперболичен косинус decbin — Переводит число из десятичной системы счисления в двоичную deg2rad — Преобразува стойност от градуси в радиани exp — e на степен подаденото число floor — Закръгляне на дробно число до по-малко цяло fmod — Връща дробния остатък при целочислено деление getrandmax — Връща максимално възможното случайно число hexdec — Переводит число из шестнадцатиричной системы счисления в десятичную hypot — Рассчитывает длину гипотенузы прямоугольного треугольника is_finite — Проверява дали стойността е допустимо крайно число is_infinite — Проверява дали стойността е безкрайност is_nan — Проверява дали стойността е "не число" log10 — Десетичен логаритъм log — Натурален логаритъм max — Връща най-голямата стойност, echo max(1, 3, 5, 6, 7); // 7 min — Връща най-малката стойност mt_getrandmax — Показва максимално възможната стойност на случайно число mt_rand — Генерира случайно число по метод mt mt_srand — Инициализира предварително генератора на случайни числа mt pi — Връща числото Пи, echo pi(); // 3.1415926535898 pow — За степенуване, например echo pow(2,3); //8 rad2deg — Преобразува стойност от радиани в градуси rand — Генерира случайно число от 0 до getrandmax(), може в диапазон, н.р. echo rand(5, 15); round — Закръгля число от тип float sin — Синус sinh — Хиперноличен синус sqrt — Корен квадратен, echo sqrt(9); //3 srand — Изменя началното число на генератора на псевдослучайни числа 7 tan — Тангенс tanh — Хиперболичен тангенс и др. Пример 15: Проверка за съществуване на функция: function_exists(string f_name) връща TRUE ако функцията с име f_name съществува, а ако не – FALSE; Да допълним пример 14 по следния начин: "; } if (function_exists('fn')) { echo "fn function is available.
\n"; } else { echo "fn functions is not available.
\n"; } fn();fn();fn(); ?> Извеждане на масив с декларираните функции: get_defined_functions(); Пример 16: Функцията get_defined_functions(); връща масив с целочислени индекси, елементите на който съдържат имената на достъпните функции.

Резултат: Array ( [internal] => Array ( [0] => zend_version [1] => func_num_args [2] => func_get_arg [3] => func_get_args [4] => strlen [5] => strcmp [6] => strncmp [7] => strcasecmp [8] => strncasecmp [9] => each [10] => error_reporting [11] => define [12] => defined [13] => get_class [14] => get_called_class ...и т.н. Задача за самостоятелна реализация Създайте скрипт, съдържащ функция recArea, която получава 2 параметъра, за дължина $l и ширина $w на паралелепипед и изчислява лицето му $area. Извежда следния текст в прозореца на браузъра: Rectangle Area Function Правоъгълник с дължина 2 и ширина 4 има лице 8. 8 Примерна реализация 1: Rectangle Area Function

Rectangle Area Function

Или примерна реализация 2: Или примерна реализация 3: Примерна реализация 4 (Интерактивна): Създайте нова версия, предоставяща форма на потребителя. След натискане на бутона “Go” се получава отговора: 9 Rectangle Area Function Правоъгълник с дължина 9 и ширина 5 има лице 45 Вариант 1. Функция index.php: Rectangle Area Function

Rectangle Area Function

Въведете дължина и ширина на правоъгълника.

Дължина: Ширина:

Функция yourfile.php: Rectangle Area Function

Rectangle Area Function

Вариант 2. Само с един файл: index.php Rectangle Area Function

Rectangle Area Function

Въведете дължина и ширина на правоъгълника.

Дължина: Ширина:

11