Функції для PHP

Продовжуємо вивчати PHP і сьогодні давайте поговоримо про функції в PHP. Сам PHP має дуже багато вбудованих функцій. Їх дуже багато, близько кількох тисяч. За допомогою них вирішуються, практично, 99% всіх поставлених завдань. Однак, для того, щоб зрозуміти як влаштовані функції PHP і взагалі зрозуміти їх суть, нам необхідно навчитися самим писати власні функції. Взагалі вміти писати власні функції потрібно не тільки для того, що зрозуміти як працюють вбудовані, а ще й для того, щоб наш код, який ми пишемо, міг виконуватися не один раз. Що я маю на увазі?

Припустимо у нас є найпростіший і банальний код, які складає числа:

<? Php $ num1 = 2; $ Num2 = 2; echo $ num1 + $ num2; ?>

Тут все дуже просто, цей код відпрацює в програмі там, де ми його напишемо. Однак, бувають ситуації і досить часто, що нам потрібно, щоб цей код відпрацював кілька разів. Наприклад, у нас є програма, яка складається з 100 рядків коду. Я хочу, щоб код, який підсумовує числа відпрацював три рази - на початку програми, в середині і в кінці. Все начебто просто - я три рази пишу цей код в трьох різних частинах програми. А що якщо цей код, складаються два числа, буде складатися не з трьох рядків а з 33 і при цьому мені потрібно кожен раз нові числа складати. Виходить, що моя програма збільшується в розмірах, плюс я дублюю один і той же код, а мені б цього не хотілося, та й не робить так ні хто.

Тому, правило програмування свідчить: якщо якась ділянка коду в програмі повторюється кілька разів, під нього потрібно писати функцію.

Тобто функція в PHP - це шматок коду, який виконується тільки тоді, коли його попросять.

У функції є опис і виклик. Як же описується функція?

Вона описується дуже просто: ключове слово function, потім ім'я функції (імена функції регістронезавісімого), далі круглі і фігурні дужки.

Ось функція, яка підсумовує числа:

<? Php function sum () {echo 2 + 2; }?>

Коли PHP читає файл, він бачить назву функції, позначає її у себе в пам'яті і поки він не бачить, що знаходиться всередині функції. Так ось, позначив він цю функцію і пішов далі читати код, який може йти після функції. Тепер, щоб цю функцію PHP виконав, її необхідно викликати в тій ділянці програми, де це необхідно. Викликати функцію в PHP дуже просто - потрібно написати ім'я функції і круглі дужки:

<? Php // Створюємо функцію function sum () {echo 2 + 2; } // Викликаємо функцію цілих три рази sum (); sum (); sum (); ?>

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

У PHP немає поняття перевантаження функції. Тобто ми не можемо оголосити функцію два рази:

<? Php function sum () {} function sum () {} // Так буде помилка! ?>

Пам'ятайте я на початку казав, що у PHP є багато своїх функцій. Так ось, при створенні своєї функції в PHP, ми не можемо дати їй таку ж назву, яке є у PHP вбудованих функцій.

Для цього існує перевірка на наявність функцій.

За допомогою функції function_exists (імя_функциі) ми можемо перевірити чи існує така функція, яку ми пишемо, чи ні. Якщо така функція існує, повертається true, якщо не існує, повертається false:

<? Php function sum () {echo 2 + 2; } If (! Function_exists ( 'sum')) {function sum () {echo 2 + 2; }} Else {echo "Така функція вже є!"; } // Виведеться, що така функція вже є! ?>

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

<? Php function sum ($ num1, $ num2) {echo $ num1 + $ num2; } Sum (5,5); // Виведеться 10?>

Я можу передати параметри в вигляді змінних:

<? Php $ one = 5; $ Two = 5; function sum ($ num1, $ num2) {echo $ num1 + $ num2; } Sum ($ one, $ two); // Виведеться 10?>

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

<? Php $ one = 5; $ Two = 5; function sum ($ num1, $ num2) {echo $ num1 + $ num2; } Sum (тут не передаємо параметри); // Виведеться помилка! ?>

Давайте для різноманітності подивимося ще один приклад і я покажу, що віддані в функцію PHP параметри можна не тільки складати.

Приклад: я хочу за допомогою функції вивести фрази Hello Mike, Hello John, Hello Zack:

&lt;? Php function hello ($ name, $ h) {echo "<h $ h> Hello, $ name! &lt;/ H $ h>"; } // Далі ми викликаємо функцію три рази з різними параметрами hello ( 'Mike', 1); hello ( 'Jonh', 2); hello ( 'Zack', 3); ?>

У нас виводяться три вітання з різними рівнями заголовків від h1 до h3.

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

наприклад:

&lt;? Php function hello ($ name = 'Mike', $ h = 1) {echo "<h $ h> Hello, $ name! &lt;/ H $ h>"; } Hello (); // Функція без параметрів, тоді вони підставляються за замовчуванням hello ( 'Jonh', 2); hello ( 'Zack', 3); ?>

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

Зверніть увагу на одну тонкість, це дуже важливо:

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

Наступний код буде не коректний:

&lt;? Php function hello ($ name = 'Mike', $ h) {echo "<h $ h> Hello, $ name! </ H $ h>"; } // Код не коректне?>

Тут при виконанні функції я вже не можу пропустити перший параметр, а він у нас не обов'язковий, тобто, я не можу записати виклик функції так:

&lt;? Php hello (, 1); // Помилка?>

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

Існує ще один варіант виклику функції в PHP - через змінну. Він використовується набагато рідше, однак ви можете його зустріти у кого-небудь в коді і щоб вас це не збентежило, я покажу як він виглядає:

&lt;? Php function hello ($ name, $ h) {echo "<h $ h> Hello, $ name! </ H $ h>"; } $ Str = 'hello'; // Значення в змінної - рядок збігається з ім'ям функції $ str ( 'Mike', 1); // Виводимо функцію через змінну?>

Коли PHP зустрічає змінну і круглу дужку, то він знає, що він повинен викликати функцію, ім'я якої лежить в цієї змінної.

Пам'ятайте в статті цикл while в PHP ми з вами робили таблицю множення. Давайте тепер спробуємо код таблиці множення зробити у вигляді функції PHP:

&lt;? Php function getTable ($ cols = 10, $ rows = 10, $ color = 'yello') {echo "<table border = '1' align = 'center'>"; for ($ tr = 1; $ tr <= $ rows; $ tr ++) {echo "<tr>"; for ($ td = 1; $ td <= $ cols; $ td ++) {if ($ tr == 1 or $ td == 1) {echo "<th style = 'background: $ color'>". $ tr * $ td. "</ th>"; } Else {echo "<td>". $ Tr * $ td. "</ Td>"; }} Echo "</ tr>"; } Echo "</ table>"; } // Виводимо три таблиці з різними параметрами і четверта без параметрів getTable (3,3, 'red'); getTable (4,4, 'blue'); getTable (5,5, 'green'); getTable (); ?>

Давайте розбиратися далі. Подивіться на цей код і скажіть, що виведеться в рядку номер 9:

&lt;? Php function hello ($ name) {echo "Hello, $ name!"; $ Name = 'Vasya'; } Hello ( 'Zack'); $ Name = 'Mike'; hello ($ name); echo $ name; // Що тут виведеться?>

Правильна відповідь Mike. Чому? Та тому що змінна, яка знаходиться всередині тіла функції і змінна, яка за її межами - це різні змінні.

У програмуванні є таке поняття, як «області видимості» - глобальна і локальна. Локальна - це та змінна, яка знаходиться всередині функції PHP і вона не доступна ззовні.

Ми можемо оголосити змінну всередині функції, але викликати її або звернутися до неї не з функції - не можемо.

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

Але проблема в тому, що нам все таки потрібно якось звернутися до локальної змінної всередині функції. Що робити? Є варіант:

Оголосити змінну всередині функції за допомогою ключового слова global.

&lt;? Php function hello ($ name) {echo "Hello, $ name!"; global $ name; $ Name = 'Vasya'; } Hello ( 'Zack'); $ Name = 'Mike'; hello ($ name); echo $ name; // Тут уже буде Vasya?>

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

Є ще один варіант оголошення змінних глобальними. Але перш, ніж розібрати цей варіант, потрібно трохи зрозуміти як влаштований PHP. Дивіться, коли ми оголошуємо змінну PHP і присвоюємо їй значення, ми робимо так: $ age = 25. Що при цьому робить PHP у себе всередині? У PHP всередині є масив GLOBALS. Так ось, коли ми присвоюємо змінної значення, PHP виділяє в масиві GLOBALS осередок пам'яті під назвою, що збігається з назвою нашої змінної: $ GLOBALS [ 'age'] = 25. Тепер ми в функції можемо зробити так:

&lt;? Php function hello ($ name) {echo "Hello, $ name!"; $ GLOBALS [ 'name'] = 'Vasya'; } Hello ( 'Zack'); $ Name = 'Mike'; hello ($ name); echo $ name; // Тут уже буде Vasya?>

Давайте тепер поговоримо ось про що! Коли ми створюємо функції, вони в принципі повинні щось повертати. Наприклад, ми створили якусь функцію, вона відпрацювала і повинна повернути результат своєї роботи. До цього моменту ми самі писали в тілі функції, наприклад, висновок якогось результату. Однак, буває потрібно, щоб функція сама повернула результат, а ми вже потім вирішили, що з ним робити. Дивіться, що я маю на увазі: ми створюємо функцію, наприклад, getNumberSum ($ numb1, $ numb2), яка виробляє арифметичні дії з числами, наприклад складає їх. Усередині цієї функції ми виробляємо обчислення. Але я не знаю, чи хочу я, вивести результат обчислення відразу в браузер або використовувати цей результат в іншому місці.

&lt;? Php function getNumberSum ($ numb1, $ numb2) {$ result = $ numb1 + $ numb2; }?>

В цьому випадку я можу просто повернути результат, а далі вже думати, що з ним робити. Повертається він за допомогою оператора return:

&lt;? Php function getNumberSum ($ numb1, $ numb2) {$ result = $ numb1 + $ numb2; return $ result; }?>

Тепер я присвою результат відпрацьованої функції змінної $ res = getNumberSum (2,3) і потім виведу цю змінну:

&lt;? Php function getNumberSum ($ numb1, $ numb2) {$ result = $ numb1 + $ numb2; return $ result; } $ Res = getNumberSum (2,3); echo $ res; ?>

Я можу зробити ще простіше: просто вивести в браузер те, що повернула мені функція:

&lt;? Php function getNumberSum ($ numb1, $ numb2) {return $ numb1 + $ numb2; } Echo getNumberSum (2,3); ?>

Дивіться, якщо у мене після return буде йти ще якийсь код, то він ніколи не виконається, так як return працює ще і як break:

&lt;? Php function getNumberSum ($ numb1, $ numb2) {return $ number1 + $ number2; / * Далі йде якийсь код * / / * Але він ніколи не виконається * /} echo getNumberSum (2,3); ?>

Пам'ятайте, ми з вами писали код меню в статті цикл FOREACH в PHP . Давайте тепер це меню опишемо за допомогою функції PHP.

Наша функція буде приймати крім параметра меню ($ menu) ще один параметр під назвою $ vertical, за замовчуванням він буде true, тобто меню буде отрісовиваться або вертикально (true), або горизонтально (false).

Ось рішення нашої задачі:

&lt;? Php // Масив з меню винесемо за межі функції $ menu = array ( "Home" => 'index.php', "About" => 'about.php', "Contact" => 'contact.php', "Search" => 'search.php'); // Створюємо функцію function menu ($ menu, $ vertical = true) {$ style = ''; // Стиль для горизонтального меню, якщо його немає, значить немає if (! $ Vertical) // Перевіряємо другий парметр, якщо він false , застосовуємо стиль $ style = 'style = "display: inline; margin-right: 15px"'; echo '<ul style = "list-style-type: none">'; foreach ($ menu as $ link => $ href) {echo "<li $ style> <a href='$href'> $ link </a> </ li>"; // Тут змінна зі стилем $ style для динамічної зміни меню} echo '</ ul>'; } Menu ($ menu, false); // Виводимо наше меню, якщо другий параметр false, малюється горизонтальне меню, якщо його прибрати, малюється вертикальне меню?>

Євген Володимирович Андрєєв


Чи знаєте Ви, що діаграма станів, Statechart diagram - це методологія об'єктно-орієнтованого проектування, призначена для представлення життєвого циклу об'єктів в реальному або абстрактному світі.

НОВИНИ ФОРУМУ
Лицарі теорії ефіру 13.06.2019 - 5:11: ЕКОЛОГІЯ - Ecology -> ПРОБЛЕМА ГЛОБАЛЬНОЇ ЗАГИБЕЛІ бджіл ТА ІНШИХ запилювачів РОСЛИН - Карім_Хайдаров.
12.06.2019 - 9:05: ВІЙНА, ПОЛІТИКА І НАУКА - War, Politics and Science -> Проблема державного тероризму - Карім_Хайдаров.
11.06.2019 - 18:05: ЕКСПЕРИМЕНТАЛЬНА ФІЗИКА - Experimental Physics -> Експерименти Серлі і його послідовників з магнітами - Карім_Хайдаров.
11.06.2019 - 18:03: ВИХОВАННЯ, ОСВІТА, ОСВІТА - Upbringing, Inlightening, Education -> Просвітництво від Андрія Маклакова - Карім_Хайдаров.
11.06.2019 - 13:23: ВИХОВАННЯ, ОСВІТА, ОСВІТА - Upbringing, Inlightening, Education -> Просвітництво від В'ячеслава Осієвського - Карім_Хайдаров.
11.06.2019 - 13:18: ВИХОВАННЯ, ОСВІТА, ОСВІТА - Upbringing, Inlightening, Education -> Просвітництво від Світлани Віслобоковой - Карім_Хайдаров.
11.06.2019 - 6:28: Астрофізики - Astrophysics -> До 110 річчя Тунгускою катастрофи - Карім_Хайдаров.
10.06.2019 - 21:23: ВИХОВАННЯ, ОСВІТА, ОСВІТА - Upbringing, Inlightening, Education -> Просвітництво від Володимира Васильовича Квачкова - Карім_Хайдаров.
10.06.2019 - 19:27: СОВІСТЬ - Conscience -> Вищий розум - Карім_Хайдаров.
10.06.2019 - 19:24: ВІЙНА, ПОЛІТИКА І НАУКА - War, Politics and Science -> ЗА НАМИ страви - Карім_Хайдаров.
10.06.2019 - 19:14: СОВІСТЬ - Conscience -> РОСІЙСЬКИЙ СВІТ - Карім_Хайдаров.
10.06.2019 - 8:40: ЕКОНОМІКА І ФІНАНСИ - Economy and Finances -> КОЛЛАПС СВІТОВОЇ ФІНАНСОВОЇ СИСТЕМИ - Карім_Хайдаров.
Що я маю на увазі?
Php $ num1 = 2; $ Num2 = 2; echo $ num1 + $ num2; ?
Як же описується функція?
Php function sum () {echo 2 + 2; }?
Php // Створюємо функцію function sum () {echo 2 + 2; } // Викликаємо функцію цілих три рази sum (); sum (); sum (); ?
Php function sum ($ num1, $ num2) {echo $ num1 + $ num2; } Sum (5,5); // Виведеться 10?
Php $ one = 5; $ Two = 5; function sum ($ num1, $ num2) {echo $ num1 + $ num2; } Sum ($ one, $ two); // Виведеться 10?
Lt;?
Lt;/ H $ h>"; } // Далі ми викликаємо функцію три рази з різними параметрами hello ( 'Mike', 1); hello ( 'Jonh', 2); hello ( 'Zack', 3); ?
Lt;/ H $ h>"; } Hello (); // Функція без параметрів, тоді вони підставляються за замовчуванням hello ( 'Jonh', 2); hello ( 'Zack', 3); ?