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