Продовжуємо вивчати PHP і сьогодні давайте поговоримо про функції в PHP. Сам PHP має дуже багато вбудованих функцій. Їх дуже багато, близько кількох тисяч. За допомогою них вирішуються, практично, 99% всіх поставлених завдань. Однак, для того, щоб зрозуміти як влаштовані функції PHP і взагалі зрозуміти їх суть, нам необхідно навчитися самим писати власні функції. Взагалі вміти писати власні функції потрібно не тільки для того, що зрозуміти як працюють вбудовані, а ще й для того, щоб наш код, який ми пишемо, міг виконуватися не один раз. Що я маю на увазі?
Припустимо у нас є найпростіший і банальний код, які складає числа:
Тут все дуже просто, цей код відпрацює в програмі там, де ми його напишемо. Однак, бувають ситуації і досить часто, що нам потрібно, щоб цей код відпрацював кілька разів. Наприклад, у нас є програма, яка складається з 100 рядків коду. Я хочу, щоб код, який підсумовує числа відпрацював три рази - на початку програми, в середині і в кінці. Все начебто просто - я три рази пишу цей код в трьох різних частинах програми. А що якщо цей код, складаються два числа, буде складатися не з трьох рядків а з 33 і при цьому мені потрібно кожен раз нові числа складати. Виходить, що моя програма збільшується в розмірах, плюс я дублюю один і той же код, а мені б цього не хотілося, та й не робить так ні хто.
Тому, правило програмування свідчить: якщо якась ділянка коду в програмі повторюється кілька разів, під нього потрібно писати функцію.
Тобто функція в PHP - це шматок коду, який виконується тільки тоді, коли його попросять.
У функції є опис і виклик. Як же описується функція?
Вона описується дуже просто: ключове слово function, потім ім'я функції (імена функції регістронезавісімого), далі круглі і фігурні дужки.
Ось функція, яка підсумовує числа:
Виникає питання, а чи варто було городити функцію три рази, якщо можна було просто кілька разів в різних місцях скласти два числа? Варто було! Дивіться, навіть вже зараз, якщо я захочу поміняти складаються числа, мені потрібно це буде зробити тільки в одному місці, в самій функції, а не лазити по всьому коду і міняти в трьох місцях, причому в різних місцях.
У PHP немає поняття перевантаження функції. Тобто ми не можемо оголосити функцію два рази:
Пам'ятайте я на початку казав, що у PHP є багато своїх функцій. Так ось, при створенні своєї функції в PHP, ми не можемо дати їй таку ж назву, яке є у PHP вбудованих функцій.
Для цього існує перевірка на наявність функцій.
За допомогою функції function_exists (імя_функциі) ми можемо перевірити чи існує така функція, яку ми пишемо, чи ні. Якщо така функція існує, повертається true, якщо не існує, повертається false:
Звичайно складати два числа, це занадто просто і банально. У нас все таки, як-ні-як динамічний мову. Так як у функції в PHP є круглі дужки, значить вони для чого там є. За допомогою цих дужок ми можемо передавати функції деякі параметри, і якщо їх багато, то передавати через кому:
Я можу передати параметри в вигляді змінних:
Якщо ми вказуємо, що функція повинна приймати параметри, а самі їх, при виконанні функції, не передали, то у нас виникне помилка у вигляді попередження, але при цьому код продовжить виконуватися.
Давайте для різноманітності подивимося ще один приклад і я покажу, що віддані в функцію PHP параметри можна не тільки складати.
Приклад: я хочу за допомогою функції вивести фрази Hello Mike, Hello John, Hello Zack:
У нас виводяться три вітання з різними рівнями заголовків від h1 до h3.
Трохи вище я писав, що якщо функцію оголосити з параметрами і, при виклику її, ці параметри й вказати, то буде помилка. Так ось, щоб не було ніяких помилок, можна не просто налаштувати установки параметри, а параметри зі значеннями за замовчуванням.
У цьому прикладі я оголосив функцію в PHP з параметрами за замовчуванням, тобто якщо я тепер викликаю цю функцію, я можу викликати її без параметрів, тоді в цьому випадку у мене підставили параметри за замовчуванням.
Зверніть увагу на одну тонкість, це дуже важливо:
Якщо ми оголошуємо функцію з параметрами за замовчуванням, то спочатку повинні йти обов'язкові параметри, а потім не обов'язкові.
Наступний код буде не коректний:
Тут при виконанні функції я вже не можу пропустити перший параметр, а він у нас не обов'язковий, тобто, я не можу записати виклик функції так:
Тому будьте уважні - спочатку йдуть обов'язкові параметри, а тільки потім не обов'язкові.
Існує ще один варіант виклику функції в PHP - через змінну. Він використовується набагато рідше, однак ви можете його зустріти у кого-небудь в коді і щоб вас це не збентежило, я покажу як він виглядає:
Коли PHP зустрічає змінну і круглу дужку, то він знає, що він повинен викликати функцію, ім'я якої лежить в цієї змінної.
Пам'ятайте в статті цикл while в PHP ми з вами робили таблицю множення. Давайте тепер спробуємо код таблиці множення зробити у вигляді функції PHP:
Давайте розбиратися далі. Подивіться на цей код і скажіть, що виведеться в рядку номер 9:
Правильна відповідь Mike. Чому? Та тому що змінна, яка знаходиться всередині тіла функції і змінна, яка за її межами - це різні змінні.
У програмуванні є таке поняття, як «області видимості» - глобальна і локальна. Локальна - це та змінна, яка знаходиться всередині функції PHP і вона не доступна ззовні.
Ми можемо оголосити змінну всередині функції, але викликати її або звернутися до неї не з функції - не можемо.
Глобальний контекст - це ті змінні, які оголошуються поза функцій PHP і вони доступні з будь-якої частини програмного коду.
Але проблема в тому, що нам все таки потрібно якось звернутися до локальної змінної всередині функції. Що робити? Є варіант:
Оголосити змінну всередині функції за допомогою ключового слова global.
Однак, у global є деякі недоліки. Коли ми оголошуємо змінну за допомогою global, ми позбавляємося ось цієї локальності. Потім, функції можуть бути досить довгими, хоча це не правильно. Якщо у вас функція вилазить за межі екрану, то, є привід задуматися, що щось не так. Ну да ладно, однак, якщо у вас така функція, то оголосивши спочатку змінну глобальної, то внизу цієї функції ми не дізнаємося глобальна ця змінна чи ні, ну забули ми або хтось інший перегорнув вашу функцію і не побачив або також забув, що спочатку вона оголошувалася глобальною. Через це можуть виникнути проблеми. Тому можна, наприклад, оголошувати змінні глобальними там, де вони використовуються в функції, а не на початку, тобто я, наприклад вирішив в середині функції попрацювати з глобальними змінними і я відразу ж в середині оголошую її глобальною.
Давайте тепер поговоримо ось про що! Коли ми створюємо функції, вони в принципі повинні щось повертати. Наприклад, ми створили якусь функцію, вона відпрацювала і повинна повернути результат своєї роботи. До цього моменту ми самі писали в тілі функції, наприклад, висновок якогось результату. Однак, буває потрібно, щоб функція сама повернула результат, а ми вже потім вирішили, що з ним робити. Дивіться, що я маю на увазі: ми створюємо функцію, наприклад, getNumberSum ($ numb1, $ numb2), яка виробляє арифметичні дії з числами, наприклад складає їх. Усередині цієї функції ми виробляємо обчислення. Але я не знаю, чи хочу я, вивести результат обчислення відразу в браузер або використовувати цей результат в іншому місці.
В цьому випадку я можу просто повернути результат, а далі вже думати, що з ним робити. Повертається він за допомогою оператора return:
Тепер я присвою результат відпрацьованої функції змінної $ res = getNumberSum (2,3) і потім виведу цю змінну:
Я можу зробити ще простіше: просто вивести в браузер те, що повернула мені функція:
Дивіться, якщо у мене після return буде йти ще якийсь код, то він ніколи не виконається, так як return працює ще і як break:
Пам'ятайте, ми з вами писали код меню в статті цикл FOREACH в PHP. Давайте тепер це меню опишемо за допомогою функції PHP.
Наша функція буде приймати крім параметра меню ($ menu) ще один параметр під назвою $ vertical, за замовчуванням він буде true, тобто меню буде отрісовиваться або вертикально (true), або горизонтально (false).
Ось рішення нашої задачі:
Євген Володимирович Андрєєв
НОВИНИ ФОРУМУ
Лицарі теорії ефіру