У лекції розглядаються: поняття функції, функції, визначені користувачем, аргументи функцій, передача аргументів за значенням і за посиланням, значення аргументів за замовчуванням і значення, що повертаються функцією (функція return ()). Приклад - створення web-інтерфейс для генерації HTML-форми.
У цій лекції будуть розглядатися питання створення і використання функцій в PHP. Говорячи «функції», ми не маємо на увазі всі існуючі в PHP функції, а лише функції, визначені користувачем. Ми розглянемо способи завдання таких функцій, методи передачі аргументів, використання аргументів зі значенням за замовчуванням і значення, що повертаються функцією.
Як приклад створимо web-інтерфейс для генерації html-форми. Тобто користувач вибирає, не вдаючись до програмування, які елементи форми потрібно створити, і характеристики цих елементів, а наша програма генерує потрібну форму.
Функції, визначені користувачем
Для чого потрібні функції? Щоб відповісти на це питання, потрібно зрозуміти, що взагалі є функціями. У програмуванні, як і в математиці, функція є відображення безлічі її аргументів на безліч її значень. Тобто функція для кожного набору значень аргументу повертає якісь значення, що є результатом її роботи. Навіщо потрібні функції, спробуємо пояснити на прикладі. Класичний приклад функції в програмуванні - це функція, що обчислює значення факторіала числа. Тобто ми задаємо їй число, а вона повертає нам його факторіал. При цьому не потрібно для кожного числа, факторіал якого ми хочемо отримати, повторювати один і той же код - досить просто викликати функцію з аргументом, рівним цьому числу.
Функція обчислення факторіала натурального числа
Таким чином, коли ми здійснюємо дії, в яких простежується залежність від якихось даних, і при цьому, можливо, нам знадобиться виконувати такі ж дії, але з іншими вихідними даними, зручно використовувати механізм функцій - оформити блок дій у вигляді тіла функції. а змінні дані - як її параметрів.
Як відбувається виклик функції? Вказується ім'я функції і в круглих дужках список значень її параметрів, якщо такі є:
Коли можна викликати функцію? Здавалося б, дивне запитання. Функцію можна викликати після її визначення, тобто в будь-якому рядку програми нижче блоку function f_name (). У PHP3 це було дійсно так. Але вже в PHP4 такої вимоги немає. Вся справа в тому, як інтерпретатор обробляє одержуваний код. Єдиний виняток становлять функції, які визначаються умовно (всередині умовних операторів або інших функцій). Коли функція визначається таким чином, її визначення повинно передувати її виклику.
Приклад 5.1. Визначення функції усередині умовного оператора
Якщо функція одного разу визначена в програмі, то перевизначити або видалити її пізніше не можна. Не дивлячись на те що імена функцій нечутливі до регістру, краще викликати функцію по тому ж імені, яким вона була задана у визначенні.
Приклад 5.2. Визначення функції усередині функції
Розглянемо докладніше аргументи функцій, їх призначення та використання.
аргументи функцій
У кожної функції може бути, як ми вже говорили, список аргументів. За допомогою цих аргументів у функцію передається різна інформація (наприклад, значення числа, факторіал якого треба підрахувати). Кожен аргумент є змінною або константу.
За допомогою аргументів дані в функцію можна передавати трьома різними способами. Це передача аргументів за значенням (використовується за умовчанням), по посиланню і завдання значення аргументів за замовчуванням. Розглянемо ці способи докладніше.
Коли аргумент передається в функцію за значенням, зміна значення аргументу всередині функції не впливає на його значення поза функцією. Щоб дозволити функції змінювати її аргументи, їх потрібно передавати по посиланню. Для цього у визначенні функції перед ім'ям аргументу слід написати знак амперсант «».
Приклад 5.3. Передача аргументів за посиланням
У функції можна визначати значення аргументів, використовувані за замовчуванням. Саме значення за замовчуванням має бути константним виразом, а не змінною і не представником класу або викликом іншої функції.
У нас є функція, що створює інформаційне повідомлення, підпис до якого змінюється в залежності від значення переданого їй параметра. Якщо значення параметра не задано, то використовується підпис "Оргкомітет".
Приклад 5.4. Значення аргументів за замовчуванням
Результатом роботи цього скрипта буде:
Якщо у функції кілька параметрів, то ті аргументи, для яких задаються значення за замовчуванням, повинні бути записані після всіх інших аргументів у визначенні функції. В іншому випадку з'явиться помилка, якщо ці аргументи будуть опущені при виклику функції.
В результаті роботи скрипта одержимо наступне
Якщо ж ми напишемо ось так:
То в результаті отримаємо:
Списки аргументів змінної довжини
В PHP4 можна створювати функції зі змінним числом аргументів. Тобто ми створюємо функцію, не знаючи заздалегідь, зі скількома аргументами її викличуть. Для написання такої функції ніякого спеціального синтаксису не потрібно. Все робиться за допомогою вбудованих функцій func_num_args (). func_get_args (). func_get_args ().
Функція func_num_args () повертає число аргументів, переданих в поточну функцію. Ця функція може використовуватися тільки усередині визначення користувальницької функції. Якщо вона з'явиться поза функцією, то інтерпретатор видасть попередження.
Приклад 5.5. Використання функції func_num_args ()
Функція func_get_arg (ціле номер_аргументу) повертає аргумент зі списку переданих у функцію аргументів, порядковий номер якого заданий параметром номер_аргументу. Аргументи функції вважаються починаючи з нуля. Як і func_num_args (). ця функція може використовуватися тільки усередині визначення будь-якої функції.
Номер_аргументу не може перевищувати число аргументів, переданих у функцію. Інакше буде згенеровано попередження, і функція func_get_arg () поверне False.
Створимо функцію для перевірки типу даних, її аргументів. Вважаємо, що перевірка пройшла успішно, якщо перший аргумент функції - ціле число, другий - рядок.
Приклад 5.6. Функція для перевірки типу даних, її аргументів
Результатом роботи буде наступне.
Функція func_get_args () повертає масив, що складається зі списку аргументів, переданих функції. Кожен елемент масиву відповідає аргументу, переданому функції. Якщо функція використовується поза визначення користувальницької функції, то генерується попередження.
Перепишемо попередній приклад, використовуючи цю функцію. Будемо перевіряти, чи є цілим числом кожен парний аргумент, який передається функції:
Як бачимо, комбінації функцій func_num_args (). func_get_arg () і func_get_args () використовується для того, щоб функції могли мати змінний список аргументів. Ці функції були додані тільки в PHP 4. У PHP3 для того, щоб домогтися подібного ефекту, можна використовувати як аргумент функції масив. Наприклад, ось так можна написати скрипт, який перевіряє, чи є кожен непарний параметр функції цілим числом:
Використання змінних всередині функції
Глобальні змінні
Щоб використовувати всередині функції змінні, задані поза нею, ці змінні потрібно оголосити як глобальні. Для цього в тілі функції слід перерахувати їх імена після ключового слова global:
Приклад 5.7. Глобальні змінні
В результаті роботи цього скрипта одержимо:
Це означає, наприклад, що видалення змінної $ var1 не видаляти глобальної змінної $ _GLOBALS [ "var1"].
статичні змінні
Приклад 5.8. Використання статичної змінної
значення, що повертаються
Всі функції, наведені вище як приклади, виконували будь-які дії. Крім подібних дій, будь-яка функція може повертати як результат своєї роботи якесь значення. Це робиться за допомогою затвердження return. Значення, що повертається може бути будь-якого типу, включаючи списки і об'єкти. Коли інтерпретатор зустрічає команду return в тілі функції. він негайно припиняє її виконання і переходить на ту рядок, з якої була викликана функція.
Наприклад, складемо функцію, яка повертає вік людини. Якщо людина не померла, то вік вважається відносно поточного року.
В цьому приклад можна було і не використовувати функцію return. а просто замінити її функцією виведення echo. Однак якщо ми все ж робимо так, що функція повертає якесь значення (в даному випадку вік людини), то в програмі ми можемо присвоїти будь-якої змінної значення цієї функції:
В результаті роботи функції може бути повернуто тільки одне значення. Кілька значень можна отримати, якщо повертати список значень (одновимірний масив). Припустимо, ми хочемо отримати повний вік людини з точністю до дня.
Коли функція повертає кілька значень для їх обробки в програмі, зручно використовувати мовну конструкцію list (), яка дозволяє одним дією привласнити значення відразу декільком змінним. Наприклад, в попередньому прикладі, залишивши без зміни функцію, обробити повертаються їй значення можна було так:
Взагалі конструкцію list () можна використовувати для присвоєння змінним значень елементів будь-якого масиву.
Приклад 5.9. Використання list ()
повернення посилання
Приклад 5.10. повернення посилання
змінні функції
PHP підтримує концепцію змінних функцій. Це означає, що якщо ім'я змінної закінчується круглими дужками, то PHP шукає функцію з таким же ім'ям і намагається її виконати.
Приклад 5.11. Використання змінних функцій
У цьому прикладі функція Show_text просто виводить рядок тексту. Здавалося б, навіщо для цього створювати окрему функцію, якщо існує спеціальна функція echo (). Справа в тому, що такі функції, як echo (). print (). unset (). include () і т.п. не можна використовувати в якості змінних функцій. Тобто якщо ми напишемо:
то інтерпретатор виведе помилку:
Тому для того, щоб використовувати будь-яку з перерахованих вище функцій як змінну функцію. потрібно створити власну функцію, що ми і зробили в попередньому прикладі.
Внутрішні (вбудовані) функції
Говорячи про функції, які визначаються користувачем, все ж не можна не сказати пару слів про вбудовані функції. З деякими з вбудованих функцій. такими як echo (). print (). date (). include (). ми вже познайомились. Насправді всі перераховані функції, крім date (). є мовними конструкціями. Вони входять в ядро PHP і не вимагають ніяких додаткових налаштувань і модулів. Функція date () теж входить до складу ядра PHP і не вимагає налаштувань. Але є і функції, для роботи з якими потрібно встановити різні бібліотеки і підключити відповідний модуль. Наприклад, для використання функцій роботи з базою даних MySql слід скомпілювати PHP з підтримкою цього розширення. Останнім часом найбільш поширені розширення і відповідно їх функції спочатку включають до складу PHP так, щоб з ними можна працювати без яких би то не було додаткових налаштувань інтерпретатора.
Рішення завдання
Нагадаємо, в чому полягає завдання. Ми хочемо написати інтерфейс, який дозволяв би створювати html-форми. Користувач вибирає, які елементи і в якій кількості потрібно створити, придумує їм назви, а наша програма сама генерує необхідну форму.
Розіб'ємо завдання на кілька підзадач: вибір типів елементів введення і їх кількості, створення назв елементів введення і обробка отриманих даних, тобто безпосередньо генерація форми. Перше завдання досить проста: потрібно написати відповідну форму, наприклад подібну наведеної нижче (task_form.html):
Лістинг 5.12. task_form.html
Коли ми пишемо в імені елемента форми, наприклад types []. це означає, що його ім'я - наступний елемент масиву types. Тобто у нас перший елемент форми ( "рядок введення тексту") буде мати ім'я types [0]. а другий (текстова область) - types [1]. У браузері task_form.html буде виглядати приблизно так:
Мал. 5.1. Форма для вибору створюваних елементів і їх кількості
Після відправки даних цієї форми ми отримаємо інформацію про те, які елементи і скільки елементів кожного типу потрібно створити. Наступний скрипт запитує назви для цих елементів:
Лістинг 5.13. ask_names.php
Припустимо, потрібно створити два елементи типу «текстовий рядок» і один елемент типу «текстова область», як і зазначено в формі вище. Тоді скрипт ask_names.php обробить її таким чином, що ми отримаємо таку форму:
Мал. 5.2. Форма для введення назв створюваних елементів
Лістинг 5.14. task.php
Результатом роботи цього скрипта з вхідними даними, наведеними вище, буде наступна форма:
Мал. 5.3. Приклад форми, згенерованої нашою програмою