Php які змінні видно лише всередині функції. Глобальні змінні PHP. Статичні змінні: вони знаходяться десь поруч

Область видимості змінної – це контекст, у якому ця змінна визначена. У більшості випадків всі змінні PHP мають лише одну область видимості. Ця єдина область видимості охоплює також файли, що включаються (include) і необхідні (require). Наприклад:

$a = 1;
include "b.inc";
?>

Тут змінна $a буде доступна всередині скрипта b.inc . Однак визначення (тіло) функції користувача задає локальну область видимості даної функції. Будь-яка змінна за умовчанням обмежена локальною областю видимості функції. Наприклад:

$a = 1; /* Глобальна область видимості */

Function test ()
{
echo $a; /* Посилання на змінну локальної області видимості */
}

Test ();
?>

Цей скрипт не згенерує жодного висновку, оскільки вираз echo вказує на локальну версію змінної $a, а в межах цієї області видимості їй не було надано значення. Можливо ви помітили, що це трохи відрізняється від мови C у тому, що глобальні змінні C автоматично доступні функціям, якщо тільки вони не були перезаписані локальним визначенням. Це може викликати деякі проблеми, оскільки люди можуть ненароком змінити глобальну змінну. У PHP, якщо глобальна змінна буде використовуватися всередині функції, вона повинна бути оголошена глобальною всередині визначення функції.

Ключове слово global

Спочатку приклад використання global:

Приклад #1 Використання global

$a = 1;
$ b = 2;

function Sum ()
{
global $a, $b;

$b = $a + $b;
}

Sum();
echo $b;
?>

Наведений вище скрипт виведе 3 . Після визначення $a і $b всередині функції як global всі посилання будь-яку з цих змінних будуть вказувати їх глобальну версію. Немає жодних обмежень на кількість глобальних змінних, які можуть оброблятися функцією.

Другий спосіб доступу до змінних глобальної області видимості - використання спеціального PHP масиву $GLOBALS . Попередній приклад може бути переписаний так:

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

Приклад #3 Суперглобальні змінні та область видимості

function test_global ()
{
// Більшість зумовлених змінних не є
// "супер", і щоб бути доступними в локальній області
// Видимо, функції вимагають вказівки "global".
global $HTTP_POST_VARS ;

Echo $HTTP_POST_VARS ["name"];

// Суперглобальні змінні доступні у будь-якій області
// видимості і вимагають вказівки " global " .
// Суперглобальні змінні доступні, починаючи з PHP 4.1.0, а
// Використання HTTP_POST_VARS вважається застарілим.
echo $_POST ["name"];
}
?>

Зауваження:

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

Використання статичних ( static) змінних

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

Приклад #4 Демонстрація необхідності статичних змінних

function test ()
{
$a = 0;
echo $a;
$a++;
}
?>

Ця функція досить марна, оскільки при кожному виклику вона встановлює $a в 0 і виводить 0 . Інкремент змінної $a++ тут ​​не відіграє ролі, тому що при виході з функції змінна $a зникає. Щоб написати корисну функцію, яка не втрачатиме поточного значення лічильника, змінна $a оголошується як static:

Приклад #5 Приклад використання статичних змінних

function test ()
{
static $a = 0;
echo $a;
$a++;
}
?>

Тепер $a буде проініціалізована тільки при першому виклику функції, а кожен виклик функції test()буде виводити значення $a та інкрементувати його.

Статичні змінні також дозволяють працювати з рекурсивними функціями. Рекурсивною є функція, що викликає саму себе. При написанні рекурсивної функції слід бути уважним, оскільки є можливість зробити рекурсію нескінченною. Ви повинні переконатися, що є адекватний спосіб завершення рекурсії. Наступна проста функція рекурсивно рахує до 10, використовуючи для визначення моменту зупинки статичну змінну $count:

Зауваження:

Статичні змінні можуть бути оголошені так, як показано у попередньому прикладі. Спроба надати цим змінним значення, що є результатом виразів, викликає помилку обробки.

Приклад #7 Оголошення статичних змінних

function foo ()(
static $ int = 0; // вірно
static $ int = 1 + 2; // неправильно (оскільки це вираз)
static $ int = sqrt (121); // неправильно (оскільки це теж вираз)

$int++;
echo $int;
}
?>

Зауваження:

Статичні оголошення обчислюються під час компіляції скрипту.

Посилання з глобальними ( global) та статичними ( static) змінними

Двигун Zend Engine 1, що лежить в основі PHP 4, оперує модифікаторами змінних static і global як посиланнями. Наприклад, реальна глобальна змінна, впроваджена в область видимості функції, вказуючи ключове слово global, Насправді створює посилання на глобальну змінну. Це може призвести до несподіваної поведінки, як це показано в наступному прикладі:

function test_global_ref() (
global $obj;
$obj = &new stdclass ;
}

function test_global_noref() (
global $obj;
$obj = new stdclass;
}

Test_global_ref();
var_dump ($obj);
test_global_noref();
var_dump ($obj);
?>

Результат виконання цього прикладу: get_instance_noref () (
static $obj;

Echo Статичний об'єкт:;
var_dump ($obj);
if (!isset($obj )) (
// Присвоїти об'єкт статичної змінної
$obj = new stdclass;
}
$obj -> property++;
return $obj;
}

$obj1 = get_instance_ref();
$still_obj1 = get_instance_ref();
echo "\n";
$obj2 = get_instance_noref();
$still_obj2 = get_instance_noref();
?>

Результат виконання цього прикладу:

Статичний об'єкт: NULL
Статичний об'єкт: NULL

Статичний об'єкт: NULL
Статичний об'єкт: object(stdClass)(1) (
["property"]=>
int(1)
}

Цей приклад демонструє, що при привласненні посилання статичної змінної вона не запам'ятовується, коли ви викликаєте функцію &get_instance_ref()вдруге.

Область видимості змінної- це контекст, у якому цю змінну визначено. Більшість змінних PHP має єдину область видимості. Ця єдина область видимості (її ще називають глобальною областю видимості) охоплює також файли, що підключаються:

У цьому прикладі змінна $a буде доступна також усередині увімкненого скрипта - main.inc .

Локальні змінні

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

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

30 ?>

Внаслідок виконання цього фрагмента буде виведено: 30.

Всередині функції birth() виконується привласнення змінної $age значення 1, але це не та сама змінна, що була визначена в глобальній області видимості. Тому, коли виконується виведення на екран значення змінної $ age, виводиться початкове значення 30. Варто зазначити, що локальні змінні створюються в момент виклику функції і видаляються після закінчення роботи функції.

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

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


У цій статті ми й займемося вивченням того, що собою являє глобальна змінна і як вона працює.

Глобальна змінна: область видимості

Контекст, у якого визначається змінна, називають областю видимості. Як правило, змінні мають лише одну область видимості. Коли глобальні змінні PHP підвантажуються з інших файлів, то вони можуть бути необхідними (require) і включаються (include). За промовчанням вони обмежені локальною областю видимості функції. Як зробити так, щоб змінну бачили файли за її межами і до того ж могли її використовувати? Саме для цього в PHP і передбачено глобальну змінну. Тут ключовим словом є саме "global". Як же оголосити глобальну змінну у мові PHP? Щоб досягти цієї мети необхідно використовувати слово «global». Його потрібно розміщувати безпосередньо перед змінною, яку ви хочете зробити глобальною. Виглядає це приблизно так: global «Змінна». Після здійснення вказівки такого роду працювати з даними зможе абсолютно будь-який файл.

Якщо десь будуть посилання на цю змінну, то програма звертатиме увагу на глобальну версію. Чому використовується таке дивне формулювання? Справа в тому, що одночасно з цим також можуть існувати і локальні версії. Але вони будуть доступнішими виключно в тих файлах, в яких вони оголошені. Для інших діятимуть глобальні змінні класу PHP. Тут треба діяти дуже уважно та обережно. Щоб запобігти будь-яким сумнівам, наведемо простий приклад, як вони можуть виглядати: global a. Якщо один файл матиме доступ до кількох змінних, це може спричинити конфлікт. Але сказати точно тут не можна, глобальна чи локальна змінна зчитуватиметься, чи все-таки станеться помилка. Якщо прописати її всередині функції, жодних проблем виникнути не повинно. Використання змінної за межами функції буде проблематичним. Тому треба дуже уважно стежити за структурою складання коду та переконатися, що ніде немає жодних передумов виникнення конфлікту.

Глобальні змінні: інший варіант запису
Чи існують інші способи завдання глобальних змінних? Так, і не один. Розглянемо для початку $GLOBALS. Він є асоціативним масивом, у якому ключем є ім'я. Як значення використовується вміст глобальної змінної. Після оголошення даний масив існує в будь-якій області видимості. Це дає підставу вважати його суперглобальним. Виглядає так: $GLOBALS [“Змінна”].

Суперглобальні змінні
У будь-якій мові програмування є імена, які зарезервовані під окремі функції. Створити в PHP однойменні глобальні змінні просто не вдасться. У цій мові програмування існують свої особливості. Так, наприклад, особливо важливим є той факт, що зумовлені змінні тут не мають приставки «супер». Це означає, що вони доступні не у всіх місцях. Як можна виправити цю ситуацію? Щоб зробити зумовлену змінну доступною у якійсь локальній мережі, необхідно оголосити її так: global «змінна». Раніше про це вже начебто йшлося. Проте, все не зовсім так. Розглянемо реальний приклад:
Global $HTTP_POST_VARS; echo $HTTP_POST_VARS ['name'].
Відчуваєте різницю? Варто мати на увазі, що в мові PHP глобальна змінна обов'язково має використовуватися в рамках функції. Вона також може розташовуватись у файлі, який включається до неї.

Безпека та посилання
Як ви самі можете переконатися, створити глобальну змінну у PHP це не проблема. Але чи існують якісь особливості щодо посилань? При використанні глобальних змінних можлива досить несподівана поведінка. Але перш ніж детальніше вивчити це питання, необхідно звернутися до передісторії. За умовчанням у версії 4.2 директива register_globals була змінена з увімкненого стану на вимкнений. Для багатьох користувачів це зовсім неважливо, і марно, адже від цього безпосередньо залежить безпека продукту, що розробляється. Якщо вам потрібно зробити глобальну змінну, то директива PHP безпосередньо не вплине на цей параметр. Однак некоректне використання може стати загрозою безпеці. Так, наприклад, якщо register_globals перебуватиме у включеному стані, то перед виконанням коду ініціалізуватимуться різні необхідні змінні. Тож її вирішили відключити. Чому світова змінна багатьом має станом цієї директиви? Проблема в тому, що при включеному стані розробникам не завжди вдавалося відповісти на запитання, звідки вона взялася, але, з іншого боку, це суттєво полегшувало процес написання коду. При цьому така організація створювала певну загрозу безпеці. Щоб уникнути перемішування даних та появи помилок, директиву було вимкнено. Тепер розглянемо приклад небезпечного коду. Також ми розберемося, як виявити випадки, коли оголошення глобальної змінної PHP супроводжується спробою заміна інформації. Це потрібно для того, щоб створювати стабільно працюючі сайти, які не зможе зламати перший-ліпший користувач.

Небезпечні коди
Встановимо, що змінна істинна для користувачів, які пройшли авторизацію:
If (authenticate_user()) ($authoriza=true;) if ($authorize) ( include “/highly/sensitive/data.php”;). Змінна в цьому стані може встановлюватись автоматично. Якщо враховувати, що дані можуть бути замінені, а джерело їх походження не встановлюється, то фактично будь-який користувач може пройти таку перевірку і видати себе за будь-кого. Зловмисник за бажання може порушити логіку роботи всього скрипта. Якщо змінити значення директиви, код працюватиме коректно. Саме це нам і потрібно зробити. Проте ініціалізація змінних не лише правилом хорошого тону серед програмістів, вона також гарантує стабільність роботи скрипта.

Надійний варіант
Для досягнення поставленої мети можна спробувати вимкнути роботу директиви, або написати складніший код, наприклад такий: if (isset($_SESSION ['username'])) (echo «Привіт» ($_SESSION ['username'])”;) else (echo “Привіт Guest”; echo “Вітаю!”;). В цьому випадку буде складно зробити заміну. Однак це можливо. Для цього потрібно заздалегідь подбати про наявність інструментів оперативного реагування. У тому випадку, якщо в PHP потрібно включити глобальні змінні, можна використовувати наступний інструмент: якщо ви точно знаєте, в якому діапазоні буде отримано значення, то можна прописати це таким чином, щоб скрипт перевіряв цей факт шляхом зіставлення. Це звичайно, теж не може гарантувати 100% захист від заміни значень. Проте перебір можливих варіантів значно ускладнить операцію.

Як виявити спробу заміни?
Тепер перевіримо, чи правильно ви зрозуміли все раніше написане. Глобальні змінні функції вам потрібно буде оголосити самостійно. Це своєрідне домашнє завдання. Спочатку наведемо код:

Наведемо деякі пояснення. Змінна C_COOKIE береться з джерела. Щоб переконатися, що її результат відповідає очікуваному, значення змінної перевіряється. У разі виникнення проблем адміністратору надходить повідомлення. Якщо нічого не сталося, жодних дій не буде.

Нотатка:активовано адаптивну версію сайту, яка автоматично підлаштовується під невеликий розмір Вашого браузера та приховує деякі деталі сайту для зручності читання. Приємного перегляду!

Привіт шановні читачі блогу Site on! Ми дізналися що є функція в PHP, навчилися створювати власні функції, передавати в них аргументи і викликати їх для виконання. Продовжуючи тему функцій у PHP, необхідно підкреслити наступні речі:

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

Функції, що залежать від умов

Ми можемо створювати (визначати, описувати) функцію залежно від умови. Наприклад:

//викликали функцію sayHi, її можна викликати в будь-якому місці /*тут не можна викликати функцію sayGoodbye, тому що ми ще не перевірили умову і не зайшли всередину конструкції if*/ if($apply)( function sayGoodbye()( echo "Усім поки!"
"; } } /*ось тепер можемо викликати sayGoodbye*/
"; }

Результат:

І погляньте на цей приклад:

/*а ось що буде, якщо викликати sayGoodbye тут*/ sayGoodbye(); if($apply)( function sayGoodbye()( echo "Усім поки!"
"; ) ) function sayHi()( echo "Всім привіт!
"; }

Результат:

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

Вкладені функції

Вкладена функція – це функція, оголошена всередині іншої функції. Приклад:

/*Тут не можна викликати sayGoodbye, оскільки вона з'явиться тільки після виклику функції sayHi*/ sayHi(); /*викликали функцію sayHi, її можна викликати в будь-якому місці*/ /*Тепер можемо викликати sayGoodbye*/ sayGoodbye(); function sayHi()( echo "Всім привіт!"
"; function sayGoodbye()( echo "Усім поки що!
"; } }

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

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

Але варто звернути увагу на дуже тонкий момент у ситуації вище: функція sayHi стає одноразовою, тому що якщо ми ще раз її викличемо, то PHP знову натрапить на визначення функції sayGoodbye, а в PHP так робити не можна – не можна перевизначати функції. Про це та про те, як з цим боротися я писав у попередній статті.

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

Область видимості змінних

У PHP рівно дві області видимості: глобальнаі локальна. У кожній мові програмування області видимості влаштовані по-різному. Наприклад, у C++ навіть у циклах своя (локальна) область видимості. У PHP, до речі, це глобальна область видимості. Але сьогодні ми говоримо про функції.

У функцій PHP своя, внутрішня область видимості (локальна), тобто всі змінні всередині функції видно тільки всередині цієї функції.

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

Шановні знавці, увага, питання! Що виведе остання інструкція echo $name; ?

Як ви самі бачили, у нас було 2 змінні $name, одна всередині функції (локальна область видимості), інша просто в коді (глобальна область видимості), останнє присвоєння змінної $nameбуло $name = "Рудь Сергій";Але оскільки це було всередині функції, то воно й залишилося. У глобальній області видимості останнім присвоєнням було $name = "Андрій";що ми, власне, і бачимо в результаті.

Тобто дві однакові змінні, але в різних сферах видимості ніяк не перетинаються і не впливають один на одного.

Давайте я проілюструю область видимості на малюнку:

При першому обході інтерпретатор швидко переглядає світову область видимості, запам'ятовує які є змінні і функції, але не виконує код.

Звернення до глобальних змінних з локальної області видимості

Але якщо нам все-таки потрібно з функції звернутися до тієї самої змінної $name з глобальної області видимості, та не просто звернутися, а змінити її? Для цього є 3 основні варіанти. Перше використання ключового слова global:

"; global $name; /*починаючи з цього моменту ми маємо на увазі глобальну змінну $name*/$name = "Рудь Сергій"; ) $ name = "Андрій"; sayHi($name); echo $name; //?

Результат:

Але цей спосіб має мінус, відколи ми звернулися до глобальної змінної $nameми втратили (переписали) локальну змінну $name.

Другий спосібполягає в тому, щоб використовувати суперглобальний масив PHP. Цей масив PHP сам, автоматично поміщає кожну змінну, яку ми створили в глобальній області видимості. Приклад:

$name = "Андрій"; // Теж саме що і$GLOBALS["name"] = "Андрій";

Отже:

$GLOBALS["name"] = "Рудь Сергій"; ) $name = "Андрій"; sayHi($name); echo $name; // ?

Результат той самий, що і під час використання ключового слова global:

Тільки цього разу ми не переписали локальну змінну, тобто змінну $nameвсередині функції залишилася колишньою і дорівнює "Андрій", а не "Рудь Сергій".

Передача аргументів за посиланням

Третій спосіб- Це передача адреси ( посилання) змінної, а чи не її значення. Посилання PHP не дуже вдалися, на відміну від інших мов програмування. Тим не менш, я розповім вам єдиний правильний варіант передачі аргументу за посиланням на функцію, який нормально підтримується в PHP 5.3 і вище. Є й інші способи роботи з посиланнями, але вони працювали в PHP 5.2 і нижче, у результаті самі розробники PHP вирішили від них відмовитись, тому не будемо про них.

Так ось, ПРАВИЛЬНА передача аргументу за посиланням у PHP 5.3 і вище здійснюється так:

Function sayHi(& $name)(

Ми в самому описі функції додали амперсанд (&) – цей значок означає, що ми приймаємо не значення змінної, а посилання (адресу) на це значення в пам'яті. Посилання в PHP дозволяють створити дві змінні, що вказують на те саме значення. Це означає, що при зміні однієї з цих змінних змінюються обидві, тому що в пам'яті вони звертаються до одного і того ж значення.

І в результаті маємо:

//Приймаємо не значення, а посилання значення echo "Привіт, ".$name."!
$name = "Рудь Сергій"; ) $name = "Андрій"; sayHi($name); echo $name; // ?

Результат:

Статичні змінні

Уявіть собі таку ситуацію: нам потрібно порахувати скільки разів ми привіталися. Ось що ми намагаємося зробити:

$c++; // збільшуємо лічильник на 1


Результат:

Змінна $cне запам'ятовує свого значення, вона щоразу створюється наново. Нам потрібно зробити так, щоб наша локальна змінна $cзапам'ятовувала своє значення після виконання функції, для цього використовують ключове слово static:

// лічильник, зробили статичним echo "Привіт, ".$name."!
$c++; // збільшуємо лічильник на 1 echo "Всього привіталися". $c. раз.


"; ) sayHi("Рудь Сергій"); sayHi("Андрій"); sayHi("Дмитро");

Результат:

Повернення значень

У функціях є така зручна річ як повернення значень. Це коли функція замість того, щоб вивести щось на екран, поміщає все змінну і віддає цю змінну нам. А ми вже далі вирішуємо, що з нею робити. Наприклад візьмемо цю функцію, вона зводить число квадрат:

Результат:

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

Результат:

Тепер ми можемо використовувати це різними способами:

//виводить результат echo "
$num = getSquare(5); echo $num;

Результат:

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

echo "До мене PHP ніколи не дійде:(";) echo getSquare (5); //виводить результат echo "
$num = getSquare(5); // надали результат у змінну echo $num; // Вивели змінну на екран

Результат:

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

Рекурсивна функція

Рекурсивна функція – це функція, що викликає себе. Рекурсія використовується не часто і вважається ресурсомісткою (повільною) операцією. Але буває, що використання рекурсії найочевидніший і найпростіший варіант. Приклад:

"; if($number< 20){ // щоб рекурсія стала нескінченною countPlease(++$number); // Функція countPlease викликала сама себе) ) countPlease(1);

Результат:

Якщо ви знаєте, як обійтися без рекурсії, краще так і зробити.

Сувора типізація в PHP (уточнення типу)

У PHP зроблено дрібні кроки до суворої типізації, завдяки цьому ми можемо заздалегідь вказати, який тип має приймати функція (це називається type-hint):

Результат:

Catchable fatal error: Argument 1 passed to countPlease() мусить бути array, integer given, називається /home/index.php on line 7 і defined in /home/index.php on line 3

Помилка нам каже, що функція очікує прийняти масив, а натомість ми їй передаємо число. На жаль, поки що ми можемо уточнювати тип тільки (array), а з PHP 5.4 ще додався такий варіант як callable:

Callableперевіряє, чи передане значення може бути викликане як функція. Callable може бути як ім'ям функції, заданим рядковою змінною, так і об'єктом і ім'ям методу, що викликається. Але про об'єкти та методи ми поговоримо пізніше (це розділ об'єктно-орієнтованого програмування), а з функціями ви вже знайомі. Результат роботи я вам показати не можу, тому що у мене зараз стоїть PHP 5.3, але він був би:

Викликали функцію getEcho

Використання аргументів змінної довжини

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

Результат:

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

func_num_args()- Повертає кількість аргументів, переданих функції
func_get_arg (порядковий номер)- Повертає елемент зі списку аргументів
func_get_args()- Повертає масив, що містить аргументи функції

"; echo func_get_arg(0) ; ) $age = 22; getEcho("Рудь Сергій", $age);

Результат:

Висновок

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

Якщо у когось є бажання набити руку, але немає ідей як це зробити – найкращим способом буде написання вже готових (вбудованих) функцій PHP, наприклад, можна написати власну функцію count() чи будь-яку іншу.

Дякую всім за увагу і до нових зустрічей! Якщо щось не зрозуміло, сміливо ставте ваші запитання у коментарях!

Змінні, визначені всередині підпрограми (функції користувача). Вони доступні лише всередині функції, де вони визначені.

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

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

Пояснимо цей факт на конкретному прикладі:

$a = 100;

function funct () (
$a = 70;
echo "

$a

" ;
}
funct();
echo "

$a

" ;
?>

Сценарій виведе спочатку 70, а потім 100:

70
100

Для позбавлення від наведеного недоліку, у PHP існує спеціальна інструкція global, що дозволяє користувальницької функції працювати з глобальними змінними. Розглянемо цей принцип на конкретних прикладах:

$a = 1;
$ b = 2;

Function Sum ()
{
global $a, $b;

$b = $a + $b;
}

Sum();
echo $b;
?>

Наведений вище скрипт виведе " 3 ". Після визначення $aі $bвсередині функції як globalвсі посилання на будь-яку з цих змінних будуть вказувати на їхню глобальну версію. Не існує жодних обмежень на кількість глобальних змінних, які можуть оброблятися функціями користувача.

Другий спосіб доступу до змінних глобальної області видимості - використання спеціального, що визначається PHP масиву $GLOBALS. Попередній приклад може бути переписаний так:

Використання $GLOBALS замість global:

$a = 1;
$ b = 2;

Function Sum ()
{
$GLOBALS [ "b" ] = $GLOBALS [ "a" ] + $GLOBALS [ "b" ];
}

Sum();
echo $b;
?>

$GLOBALS- це асоціативний масив, ключем якого є ім'я, а значенням – вміст глобальної змінної. Зверніть увагу, що $GLOBALS існує у будь-якій області видимості, це пояснюється тим, що цей масив є. Нижче наведено приклад, що демонструє можливості суперглобальних змінних:

function test_global ()
{
// Більшість зумовлених змінних не є
// "супер" і щоб бути доступними в локальній області
// Видимості функції вимагають вказівки "global".
global $HTTP_POST_VARS ;

Echo $HTTP_POST_VARS ["name"];

// Суперглобальні змінні доступні у будь-якій області
// видимості і вимагають вказівки " global " .
// Суперглобальні змінні доступні, починаючи з PHP 4.1.0
echo $_POST ["name"];
}
?>