Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Аргументи функцій. У кожної функції може бути список аргументів. За допомогою цих аргументів у функцію передається різна інформація. Кожен аргумент є змінною або константою




І. Функції в PHP

План

ЛЕКЦІЯ 8

Тема: Функції та масиви

1. Функції в PHP.

2. Робота з масивами даних.

 

У програмуванні, як і в математиці, функція є відображення безлічі її аргументів на безліч значень. Тобто, функція для кожного набору значень аргумента повертає відповідні значення, що є результатом її роботи.

Функція може бути визначена за допомогою наступного синтаксису:

 

 

function Ім’я_функції (параметр1, параметр2... параметрN){ Блок_дій return "Значення, повернене функцією";}

Ім’я_функції і імена параметрів функції (параметр 1, параметр 2 і так далі) повинні відповідати правилам найменування в PHP. Імена функцій нечутливі до регістра. Параметри функції – це змінні мови, тому перед назвою кожного з них повинен стояти знак $. Замість слів блок_дій в тілі функції повинен знаходитися будь-який правильний PHP-код (не обов’язково залежний від параметрів). Після ключового слова return повинен йти коректний php-вираз. Загалом, у функції може і не бути параметрів та значення, яке вона повертає.

Для виклику функції вказується ім’я функції і в круглих дужках список значень її параметрів, якщо такі є:

 

<?php Ім’я_функції("значення_для_параметра1","значення_для_параметра2"...);?>

У PHP3 виклик функції можливий тільки після її визначення, тобто в будь-якому рядку програми нижче за блок function f_name(){...}. В PHP4 такої вимоги немає. Єдиний виняток становлять функції, визначені умовно (усередині умовних операторів або інших функцій). Коли функція зазначена таким чином, її визначення повинне передувати її виклику.

<?php $make = true; /* тут не можна викликати Make_event(); тому що вона ще не існує, але можна викликати Save_info() */ Save_info("Вася", "Іванов", "Я вибрав курс по PHP"); if ($make) { 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 можна викликати і тут?>

Якщо функція уже була визначена в програмі, то перевизначити або видалити її пізніше не можна. Не дивлячись на те, що імена функцій нечутливі до регістру, краще викликати функцію по тому ж імені, яким вона була задана у визначенні.

За допомогою аргументів дані у функцію можна передавати трьома різними способами – це передача аргументів за значенням (використовується за замовчуванням), за посиланням та заданням значення аргументів за замовчуванням. Розглянемо ці способи докладніше.

Коли аргумент передається у функцію за значенням, зміна значення аргумента усередині функції не впливає на його значення поза функцією. Щоб дозволити функції змінювати її аргументи, їх потрібно передавати за посиланням. Для цього у визначенні функції перед ім’ям аргумента слід написати знак амперсанд «&».

<?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>"; // виведе вже відмічену радіо кнопку?>

У функції можна визначати значення аргументів, використовувані за замовчуванням. Саме значення повинне бути константним виразом, а не змінною і не представником класу або викликом іншої функції.

Якщо у функції декілька параметрів, то ті аргументи, для яких задаються значення за замовчуванням, повинні бути записані після решти всіх аргументів у визначенні функції. Інакше з’явиться помилка, якщо ці аргументи будуть опущені при виклику функції.

Наприклад, ми хочемо внести опис статті до каталогу. Користувач повинен ввести такі характеристики статті, як її назва, автор і короткий опис. Якщо користувач не вводить ім’я автора статті, вважаємо, що це Іванов Іван.

<?phpfunction Add_article($title, $description, $author = "Іванов Іван") { echo "Заносимо в каталог статтю: $title,"; echo "автор $author"; echo "<br>Краткое опис: "; echo "$description <hr>"; } Add_article("Інформатика і ми", "Це стаття про інформатику...", "Петров Петро"); Add_article("Хто такі хакери", "Це стаття про хакерів...");?>

Результат роботи скрипта:

Заносимо в каталог статтю: Інформатика і ми, автор Петров Петро.Короткий опис: Це стаття про інформатику... Заносимо в каталог статтю: Хто такі хакери, автор Іванов Іван.Короткий опис: Це стаття про хакерів...

 

У PHP4 можна створювати функції із змінним числом аргументів. Тобто ми створюємо функцію, не знаючи заздалегідь, з скількома аргументами її викличуть. Для написання такої функції ніякого спеціального синтаксису не потрібно. Все робиться за допомогою вбудованих функцій func_num_args(), func_get_arg(), func_get_args().

Функція func_num_args() повертає число аргументів, переданих в поточну функцію. Ця функція може використовуватися тільки усередині визначення, призначеного для користувача функції. Якщо вона з’явиться поза функцією, то інтерпретатор видасть попередження.

 

<?phpfunction DataCheck(){$n = func_num_args();echo "Число аргументів функції $n";}DataCheck(); /* виведе рядок "Число аргументів функції 0" */DataCheck(1, 2, 3); /* виведе рядок "Число аргументів функції 3" */?>

Функція func_get_arg повертає аргумент із списку переданих у функцію аргументів, порядковий номер якого заданий параметром номер_аргумента. Аргументи функції нумеруються, починаючи з нуля. Як і func_num_args(), ця функція може використовуватися тільки усередині визначення якої-небудь функції.

Номер_аргумента не може перевищувати числа аргументів, переданих у функцію. Інакше згенерується попередження, і функція func_get_arg() поверне значення False.

Створимо функцію для перевірки типу даних її аргументів. Вважаємо, що перевірка пройшла успішно, якщо перший аргумент функції – ціле число, другий – рядок.

 

<?phpfunction DataCheck(){$check =true; // число аргументів, переданих у функцію$n = func_num_args(); /* перевіряємо, чи є перший переданий аргумент цілим числом */if ($n >= 1) if (!is_int(func_get_arg(0))) $check = false;/* перевіряємо, чи є другий, переданий аргумент рядком */if ($n >= 2) if (!is_string(func_get_arg(1))) $check = false;return $check;}if (DataCheck(123, "text")) echo "Перевірка пройшла успішно <br>";else echo "Дані не задовольняють умови<br>";if (DataCheck(324)) echo "Перевірка пройшла успішно<br>";else echo "Дані не задовольняють умови<br>";?>

Результатом роботи програми буде наступне:

Перевірка пройшла успішноПеревірка пройшла успішно

 

Функція func_get_args() повертає масив, що складається із списку аргументів, переданих функції. Кожен елемент масиву відповідає аргументу, переданому функції. Якщо функція використовується поза визначенням призначеної для користувача функції, то генерується попередження.

Перепишемо попередній приклад, використовуючи дану функцію. Перевірятимемо, чи є цілим числом кожен парний аргумент, передаваний функції:

 

<?phpfunction DataCheck(){$check =true;$n=func_num_args(); /*число аргументів переданих у функцію*/$args = func_get_args(); /* масив аргументів функції */for ($i=0; $i < $n; $i++){$v = $args[$i];if ($i % 2 == 0){ // перевіряємо, чи є парний аргумент цілимif (!is_int($v)) $check = false; } }return $check;}if(DataCheck(array("text",324)))echo "Перевірка пройшла успішно <br>";else echo "Дані не задовольняють умови<br>";?> Комбінації функцій func_num_args(), func_get_arg() і func_get_args() використовуються для того, щоб функції могли мати змінний список аргументів. Ці функції були додані в PHP 4.

Використання змінних усередині функції. Щоб використовувати усередині функції змінні, задані поза нею, ці змінні потрібно оголосити як глобальні. Для цього в тілі функції слід перерахувати їх імена після ключового слова global:

global $var1, $var2;<?php $a = 1; function Test_g() { global $a; $a = $a*2; echo 'в результаті роботи функції $a=',$a; } echo 'поза функцією $a=',$a',, '; Test_g(); echo "<br>"; echo 'поза функцією $a=',$a',, '; Test_g();?>

Результат роботи скрипта:

поза функцією $a=1, в результаті роботи функції $a=2поза функцією $a=2, в результаті роботи функції $a=4

 

Коли змінна оголошується як глобальна, фактично створюється посилання на глобальну змінну. Тому такий запис еквівалентний наступному (масив GLOBALS містить всі змінні, глобальні щодо поточної області видимості):

$var1 = &$GLOBALS["var1"];$var2 = &$GLOBALS["var2"];

Це означає, наприклад, що видалення змінної $var1 не видаляє глобальної змінної $_GLOBALS["var1"].

Щоб використовувати змінні тільки усередині функції, при цьому зберігаючи їх значення і після виходу з функції, потрібно оголосити ці змінні як статичні. Статичні змінні видно тільки усередині функції і не втрачають свого значення, якщо виконання програми виходить за межі функції. Оголошення таких змінних проводиться за допомогою ключового слова static:

static $var1, $var2;

Статичній змінній може бути привласнене будь-яке значення, але не посилання.

<?php function Test_s() { static $a = 1; $a = $a*2; echo $a; } Test_s(); // виведе 2 echo $a; /* нічого не виведе, оскільки $a доступна тільки усередині функції */ Test_s(); /* усередині функції $a=2, тому результатом роботи функції буде число 4 */?>

Всі функції, приведені вище як приклади, виконували які-небудь дії. Окрім подібних дій, будь-яка функція може повертати як результат своєї роботи яке-небудь значення. Це робиться за допомогою 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, 2011);

У результаті роботи функції може бути повернене тільки одне значення. Декількох значень можна набути, якщо повертати список значень (одновимірний масив). Допустимо, потрібно отримати повний вік людини з точністю до дня.

 

<?phpfunction Full_age($b_day, $b_month, $b_year){$y = date("Y");$m = intval(date("m"));$d = intval(date("d"));$b_month = intval($b_month);$b_day = intval($b_day);$b_year = intval($b_year);$day = ($b_day > $d? 30 - $b_day + $d: $d - $b_day);$tmpMonth = ($b_day > $d? -1: 0);$month = ($b_month > $m + $tmpMonth? 12 - $b_month + $tmpMonth + $m: $m+$tmpMonth - $b_month);$tmpYear = ($b_month > $m + $tmpMonth? -1: 0);if ($b_year > $y + $tmpYear){$year = 0;$month = 0;$day = 0;}else $year = $y + $tmpYear - $b_year;return array ($day,$month,$year);}$age = Full_age("29", "06", "1986");echo "Вам $age[2] років $age[1] місяців і $age[0] днів";?>

Коли функція повертає декілька значень для їх обробки в програмі, зручно використовувати мовну конструкцію list(), яка дозволяє однією дією привласнити значення відразу декільком змінним. Наприклад, в попередньому прикладі, залишивши без зміни функцію, обробити повернені нею значення можна було так:

 

<?php // завдання функції Full_age() list($day, $month,$year)= Full_age("07", "08", "1974"); echo "Вам $year років $month місяців і $day днів";?>

 

Взагалі конструкцію list() можна використовувати для привласнення змінним значень елементів будь-якого масиву.

<?php $arr = array("first", "second"); list($a, $b)= $arr; // змінній $a привласнюється перше // значення масиву $b – друге echo $a",$b; // виведе рядок "first second"?>

Повернення посилання. У результаті своєї роботи функція також може повертати посилання на яку-небудь змінну. Це може стати в нагоді, якщо потрібно використовувати функцію для того, щоб визначити, якій змінній повинне бути привласнена посилання. Щоб отримати з функції посилання, потрібно під час оголошення перед її ім’ям написати знак амперсанд (&) і кожного разу при виклику функції перед її ім’ям теж писати амперсанд (&). Зазвичай функція повертає посилання на яку-небудь глобальну змінну, посилання на статичну змінну або посилання на один з аргументів, якщо він був також переданий за посиланням.

<?php $a = 3; $b = 2; function & ref($par) { global $a, $b; if ($par % 2 == 0) return $b; else return $a; } $var =& ref(4); echo $var, " і ", $b"<br>"; // виведе 2 і 2 $b = 10; echo $var, " і ", $b"<br>"; // виведе 10 і 10?>

Під час використання синтаксису посилань в змінну $var не копіюється значення змінної $b поверненою функцією $ref, а створюється посилання на цю змінну. Тобто тепер змінні $var і $b ідентичні і змінюватимуться одночасно.

Змінні функції. PHP підтримує концепцію змінних функцій. Це означає, що якщо ім’я змінної закінчується круглими дужками, то PHP шукає функцію з таким же ім’ям і намагається її виконати, наприклад:

<?php /* створимо дві прості функції: Add_sign – додає підпис до рядка і Show_text – виводить рядок тексту */ function Add_sign($string, $sign="С пошаною, Петро") { echo $string." ".$sign; } function Show_text() { echo "Відправити повідомлення по почте<br>"; } $func = "Show_text"; // створюємо змінну із значенням // рівним імені функції Show_text $func(); // це викличе функцію Show_text $func = "Add_sign"; // створюємо змінну із значенням // рівним імені функції Add_sign $func("Привіт всім <br>"); // це викличе функцію // Add_sign з параметром "Привіт всім"?>

У даному прикладі функція Show_text просто виводить рядок тексту. Здавалося б, навіщо для цього створювати окрему функцію, якщо існує спеціальна функція echo(). Річ у тому, що такі функції, як echo(), print(), unset(), include() і тому подібні не можна використовувати як змінні функції. Тобто якщо ми напишемо:

<?php$func = "echo ";$func("TEXT");?>

то інтерпретатор виведе помилку:

 

Fatal error: Call to undefined function: echo() in c:\users\nina\tasks\func\var_f.php on line 2

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

Внутрішні (вбудовані) функції. З деякими з вбудованих функцій, такими як echo(), print(), date(), include(), ми вже познайомилися. Насправді всі перераховані функції, окрім date(), є мовними конструкціями. Вони входять в ядро PHP і не вимагають ніяких додаткових налаштувань і модулів. Функція date() теж входить до складу ядра PHP і не вимагає налаштувань. Але є і функції для роботи з якими потрібно встановити різні бібліотеки та підключити відповідний модуль. Наприклад, для використання функцій роботи з базою даних MySql слід скомпілювати PHP з підтримкою цього розширення. Останнім часом найбільш поширені розширення і їх функції спочатку включають до складу PHP так, щоб з ними можна було працювати без будь-яких додаткових налаштувань інтерпретатора.




Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 1226; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.034 сек.