Лекція № 11
Тема: Користувацькі функції
План
Користувацькі функції
Створення функцій
Що таке «призначені для користувача функції»
У будь-якій мові програмування існують підпрограми. У мові С вони називаються функціями, в асемблері — підпрограмами і викликаються інструкцією CALL, а в мові Pascal існує навіть два види підпрограм: процедури і функції.
Підпрограма — це спеціальним чином оформлений фрагмент програми, до якого можна звернутися з будь-якого місця усередині програми. Підпрограми істотно спрощують життя програмістам: вони покращують читабельність початкового коду, скорочують початковий код (не потрібно писати один і той же фрагмент кілька разів). У мові PHP підпрограми називаються функціями.
Раніше ми розглядали стандартні функції, передбачені самою мовою PHP. Проте часто стандартні функції не вистачає і виникає необхідність створення своєї власної функції, що володіє необхідними якостями. Такі створювані самостійно функції і називаються призначеними для користувача. Про те, як їх створювати і використовувати, ми і дізнаємося в цьому розділі.
Особливості призначених для користувача функцій в РНР
Як уже згадувалося, в мові РНР підпрограми називаються функціями. Ось особливості використання функцій в РНР:
Ви можете використовувати параметри, встановлені за умовчанням. Це, зокрема, дозволяє викликати одну і ту ж функцію із змінним числом параметрів.
Функція може повертати будь-який тип.
Область видимості змінних усередині функції, так само як і в інших мовах програмування, деревовидна.
Наявність інструкції return, як в мові С.
Можна змінювати змінні, передані як аргумент (як параметр-змінна в Паскалі).
Мова РНР надає програмістові величезну свободу при створенні власних функцій. При програмуванні на інших мовах мені дуже не вистачало параметри за умовчанням, які дозволяють написати функцію з різним числом параметрів. У мові C++ з'явився механізм перезавантаження функцій, але параметри за умовчанням — це гнучкіший засіб. Адже в C++ для кожної переобтяженої функції нам потрібно наново писати її тіло. А в мові РНР цього робити не потрібно. У цьому розділі ми обов'язково розглянемо параметри за умовчанням.
Проте у PHP-функцій окрім переваг є і недоліки, причому істотні. Перший недолік пов'язаний з оголошенням локальній функції. У РНР ви не можете оголосити локальну функцію, як це можна робити в інших мовах. Тобто, ви не можете створити функцію усередині іншої функції так, щоб перша (вкладена) функція була видна тільки в другій функції. У РНР вкладена функція буде видна всій програмі, тобто, не буде локальної. Розглянемо наступний приклад:
<?
function first() { echo "First"; function Second() (
echo "Second"; } )
First () ; second ()
?>
Сценарій надрукує FirstSecond. Це означає, що нібито локальна функція доступна у всій програмі.
Примітка. Зверніть увагу на імена функцій при оголошенні (first і Second) і при виклику (First і second). Це не друкарська помилка - РНР нечутливий до регістра імен функцій. Ви можете викликати функцію first(), FIRsT() або якось інакше.
Другий недолік пов'язаний з областю видимості функцій. Але спочатку небагато скажемо про глобальні і локальні змінні. Глобальні змінні — це змінні, які видно і доступно всій програмі зі всіма вхідними в неї підпрограмами(функціям). Локальні змінні, визначені усередині підпрограм, видно і доступно тільки усередині самої підпрограми(функції), в якій вони визначені.
Так от, в РНР всі оголошені і використовувані у функції змінні за умовчанням локальні для функції. Тобто, за умовчанням ви не можете змінити значення глобальної змінної в тілі функції як це можна зробити в інших мовах програмування. Якщо ви у функції використовуватимете змінну з ім'ям, ідентичним імені глобальної змінної, то це ніякого відношення до глобальної змінної мати не буде. Просто у функції буде створена локальна змінна з таким же ім'ям і за межами функції вона видна не буде.
Наступний приклад підтверджує даний факт:
$i = 10;
function change() {
$i = 5;
echo "i = $i<br>\n";
change () ;
echo "i = $i";
Сценарій спочатку надрукує 5, а потім — 10.
Проте, в РНР існує можливість позбавитися від цього недоліку. Для цього передбачено використання спеціальної інструкції global, яка дозволяє функції працювати з глобальними змінними. Докладніше про це ми говоритимемо в п. 8.6.
Створення призначених для користувача функцій
Функція може бути оголошена в будь-якій частині програми (в межах операторів <? і ?>), але до місця першого її використання. Іншими словами, не потрібно ніякого попереднього оголошення, як в інших мови програмування, зокрема, в С. Дойдя до визначення функції, транслятор перевірить коректність визначення і відтранслюватиме визначення функції у внутрішнє уявлення, але транслювати код він не стане. Даний підхід є найправильнішим — навіщо транслювати код, який, можливо, ніколи не використовуватиметься?
Для оголошення функцій використовується такий синтаксис:
function Ім'я (аргумент1[=значение1],...,аргумент1[=значение1])
{
тіло функції
}
Оголошення функції починається службовим словом function, потім слідує ім'я функції, після імені — список аргументів в дужках. Тіло функції полягає у фігурні дужки і може містити довільне число операторів.
Вимоги до імен функцій:
Ім'я функції може містити російські букви, але давати функціямросійські імена із зрозумілих причин не рекомендується.
Ім'я функції не повинне містити пропусків і пробільних символів.
Ім'я повинне бути унікальним з точністю до регістра, тобтофункції F1() і fl() — це одна і та ж функція.
Функціям можна давати такі ж імена, як і змінним, тільки без знаку долара на початку імені.
Оскільки тип повертаного значення може бути будь-яким, його (тип) не указують зовсім. Для передачі результату роботи функції в основну програму використовується інструкція return. Якщо функція нічого не повертає, інструкцію return не указують. Інструкція return може повертати все, що завгодно, у тому числі і масиви.
Перша функція
Ми вже знаємо достатньо про функції, щоб написати власну функцію. Наприклад, наступна функція повертає масив з 10 випадкових чисел.
<?
function GetRand() {
$LocalArr = array();
mt_srand(time());
for($i=;$i<10;$i++) $LocalArr[] = mt_rand(0,100);
return $LocalArr;
}
$A = GetRand();
foreach($a as)
?>