Лекція №1

 

Лекція №1.

Що таке PHP, Можливості PHP, Коментарі, Змінні, константи й оператори, Масиви та списки в PHP, Керуючі конструкції, Цикли, Оператори передачі управління, Оператори включення, Функції користувача, Символічні і жорсткі посилання

Що таке PHP

PHP- це широко розповсюджена мова сценаріїв загального призначення з відкритим вихідним кодом.

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

Абревіатура PHP означає "Hypertext Preprocessor (Препроцесор Гіпертексту)". Синтаксис мови бере початок з C, Java і Perl. PHP досить простий для вивчення. Перевагою PHP є надання web-розробникам можливості швидкого створення динамічних web-сторінок.

Важливою перевагою мови PHP перед такими мовами, як мов Perl і C полягає в можливості створення HTML документів із вбудованими командами PHP.

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

PHP дозволяє створювати якісні Web-додатки за дуже короткі терміни, отримані продукти легко модифікуються і підтримуються в майбутньому.

PHP простий для освоєння, і разом з тим здатний задовольнити інтереси професійних програмістів.

Мова PHP постійно удосконалюється, і їй, напевно забезпечене довге домінування в області мов web-програмування, принаймні, найближчим часом.

Можливості PHP

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

Існують три основні області застосування PHP.

  • Створення скриптів для виконання на стороні сервера. PHP найбільш широко використовується саме таким чином. Все, що вам знадобиться, це інтерпретатор PHP (у вигляді програми CGI або серверного модуля), вебсервер і браузер. Для того щоб можна було переглядати результати виконання PHP-скриптів в браузері, потрібен працюючий веб-сервер і встановлений PHP. У випадку, якщо ви просто експериментуєте, ви цілком можете використовувати свій домашній комп'ютер замість сервера.
  • Створення скриптів для виконання в командному рядку. Ви можете створити PHP-скрипт, здатний запускатися незалежно від веб-сервера та броузера. Все, що вам буде потрібно – парсер PHP. Такий спосіб використання PHP ідеально підходить для скриптів, які повинні виконуватися регулярно, наприклад, за допомогою cron (на платформах * nix або Linux) або за допомогою планувальника завдань (Task Scheduler) на платформах Windows. Ці скрипти також можуть бути використані в задачах простої обробки текстів.
  • Створення звичайних програм, що виконуються на стороні клієнта. Можливо, PHP є не найкращою мовою для створення подібних додатків, але, якщо ви дуже добре знаєте PHP і хотіли б використати деякі його можливості у своїх клієнт-додатках, ви можете використовувати PHP-GTK для створення таких додатків. Подібним чином ви можете створювати і крос-платформні додатки. PHP-GTK є розширенням PHP і не поставляється разом з дистрибутивом PHP.

PHP доступний для більшості операційних систем, включаючи Linux, багато модифікації Unix (такі, як HP-UX, Solaris і OpenBSD), Microsoft Windows, Mac OS X, RISC OS, та багатьох інших. Також в PHP включена підтримка більшості сучасних веб-серверів, таких, як Apache, Microsoft Internet Information Server, Personal Web Server, серверів Netscape і iPlanet, сервера Oreilly Website Pro, Caudium, Xitami, OmniHTTPd та багатьох інших. Для більшості серверів PHP поставляється в якості модуля, для інших, що підтримують стандарт CGI, PHP може функціонувати як процесор CGI.

Таким чином, вибираючи PHP, ви отримуєте свободу вибору операційної системи і веб-сервера. Крім того, у вас з'являється вибір між використанням процедурного або об'єктно-орієнтованого програмування або ж їх поєднання. Багато бібліотек коду і великі програми (включаючи бібліотеку PEAR) написані тільки з використанням ООП.

PHP здатний генерувати не тільки HTML. Доступно формування зображень, файлів PDF і навіть роликів Flash (з використанням libswf і Ming), що створюються «на льоту». PHP також здатний генерувати будь-які текстові дані, такі, як XHTML та інші XML-файли. PHP може здійснювати автоматичну генерацію таких файлів і зберігати їх у файловій системі вашого сервера замість того, щоб віддавати клієнту, організовуючи, таким чином, кеш динамічного наповнення, розташований на стороні сервера.

Інструментарій

Мінімальна програма

Традиційно, знайомство з мовою програмування починають з горезвісної програми "Hello, World!". Що ж, ми не будемо відступати від цієї традиції, і напишемо нашу першу програму на PHP!

Отже, беремо редактор PHP-коду, і напишемо наступний PHP код:

<? Php
echo "Hello, World!";
?>

Перш, ніж запустити програму, її потрібно встановити на сервері. Для цього збережіть написаний PHP-скрипт під назвою start.php. Потім скопіюйте його в каталог DocumentRoot вашого сервера. Тепер наберіть в адресному рядку вашого браузера http://localhost/start.php і, якщо все встановлено і налаштовано правильно, ви побачите текст Hello, World!

 

Синтаксис

Ми приступаємо до вивчення основних елементів синтаксису мови PHP. Розглянемо способи поділу інструкцій і створення коментарів, змінні, константи, типи даних і оператори.

Основний синтаксис

Перше, що потрібно знати щодо синтаксису PHP, - це те, як він вбудовується в HTML-код, як інтерпретатор дізнається, що це код на мові PHP. В прикладах ми найчастіше будемо використовувати варіант <? Php?>, І іноді скорочений варіант <? ?>.

Поділ інструкцій

Програма на PHP (та й на будь-якій іншій мові програмування) - це набір команд (інструкцій). Оброблювачу програми (парсеру) необхідно якось відрізняти одну команду від іншої. Для цього використовуються спеціальні символи - роздільники. У PHP інструкції поділяються так само, як і у Cі або Perl, - кожен вираз закінчується крапкою з комою.

Закриваючий тег «?>» Має на увазі кінець інструкції, тому перед ним крапку з комою не ставлять. Наприклад, два наступних фрагмента коду еквівалентні:

<? Php  
echo "Hello, world!"; / / крапка з комою      
// В кінці команди   
// Обов'язкова
?> 
<? Php   
echo "Hello, world!" ?>     
<! - Крапка з комою
опускається з-за "?>" ->

Коментарі

Часто при написанні програм виникає необхідність робити будь-які коментарі до коду, які ніяк не впливають на сам код, а тільки пояснюють його. Це важливо при створенні великих програм і у випадку, якщо кілька людей працюють над однією програмою. При наявності коментарів у програмі в її коді розібратися набагато простіше. Крім того, якщо вирішувати задачу по частинах, недороблені частини рішення також зручно коментувати, щоб не забути про них надалі. В усіх мовах програмування передбачена можливість включати коментарі в код програми. PHP підтримує кілька видів коментарів: у стилі Сі, C ++ і оболонки Unix. Символи // і # позначають початок однорядкових коментарів, /* і */ - відповідно початок і кінець багаторядкових коментарів.

Приклад 1. Використання коментарів в PHP 

<? Php
echo "Мене звуть Вася";
// Це однорядковий коментар
// У стилі С ++
echo "Прізвище моє Петров";
/* Це багаторядковий коментар.
Тут можна написати кілька рядків.
При виконанні програми все, що
знаходиться тут, буде проігнороване. */
echo "Я вивчаю PHP";
# Це коментар в стилі
# Оболонки Unix
?>

 

Змінні, константи й оператори

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

Змінні

Змінна у PHP позначається знаком долара, за яким слідує її ім'я. Наприклад: $My_var

Ім'я змінної чутливо до регістру, тобто змінні $my_var і $My_var різні.

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

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

 

Константи

Для зберігання постійних величин, тобто таких величин, значення яких не змінюється в ході виконання скрипта, використовуються константи. Такими величинами можуть бути математичні константи, паролі, шляхи до файлів і т.п. Основна відмінність константи від змінної полягає в тому, що їй не можна присвоїти значення більше одного разу і її значення не можна анулювати після її оголошення. Крім того, у константи немає приставки у вигляді знаку долара і її не можна визначити простим присвоєнням значення. Як же тоді можна визначити константу? Для цього існує спеціальна функція define (). Її синтаксис такий:

define ("Імя_константи", 
"Значення_константи", 
[Нечутливість _до_регістру])

За замовчуванням імена констант чутливі до регістру. Для кожної константи це можна змінити, вказавши в якості значення аргументу Нечутливість _до_регістру значення True. Існує правило, за яким імена констант завжди пишуться у верхньому регістрі.

Отримати значення константи можна, вказавши її ім'я. На відміну від змінних, не потрібно випереджати ім'я константи символом $. Крім того, для отримання значення константи можна використовувати функцію constant () з ім'ям константи в якості параметра.

Приклад 3. Константи в PHP

<? Php  
// Визначаємо константу  
// PASSWORD         
define ("PASSWORD", "qwerty");       
// Визначаємо регістро незалежну     
// Константу PI зі значенням 3.14       
define ("PI", "3.14", True);
// Виведемо значення константи PASSWORD,    
// Тобто qwerty        
echo (PASSWORD);
// Теж виведе qwerty
echo constant ("PASSWORD"); 
echo (password);      
/ * Виведе password і попередження, 
оскільки ми ввели регістрочутливу   
константу PASSWORD * /        
echo pi;  
// Виведе 3.14, оскільки константа PI 
// Регістронезалежна за визначенням 
?> 
 

Крім змінних, які декларуються користувачем, про які ми тільки що розповіли, в PHP існує ряд констант, що визначаються самим інтерпретатором. Наприклад, константа __FILE__ зберігає ім'я файлу програми (і шлях до нього), яка виконується в даний момент, __FUNCTION__ містить ім'я функції, __CLASS__ - ім'я класу, PHP_VERSION - версія інтерпретатора PHP. Повний список зумовлених констант можна отримати, прочитавши посібник з PHP.

 

Оператори

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

Таблиця 1. Арифметичні оператори

Позначення

Назва

Приклад

+

Додавання

$a + $b

-

Віднімання

$a - $b

*

Множення

$a * $b

/

Ділення

$a / $b

%

Залишок від ділення

$a % $b

 

Таблиця 2. Строкові оператори

Позначення

Назва

Приклад

.

Конкатенація (додавання рядків)

$c = $a . $b (це рядок, що складається з $a і $b)

 

Таблиця 3. Оператори присвоювання

Позначення

Назва

Опис

Приклад

=

Присвоєння

Змінній ліворуч від оператора буде присвоєне значення, отримане в результаті виконання яких-небудь операцій або змінній/константи із правої сторони

$a = ($b = 4) +5; ($a буде дорівнювати 9, $b буде дорівнювати 4)

+=

Скорочення

Додає до змінної число й потім присвоює їй отримане значення

$a += 5; (еквівалентно $a = $a + 5;)

.=

Назва

Скорочено позначає комбінацію операцій конкатенації й присвоювання (спочатку додається рядок, потім отримана рядок записується в змінну)

$b = "Привіт "; $b .= "всім"; (еквівалентно $b = $b . "всім";) У результаті: $b="Привіт всім"

 

Таблиця 4. Логічні оператори

Позначення

Назва

Опис

Приклад

And

і

$a і $b істинні (True)

$a and $b

&&

і

 

$a && $b

Or

Або

Хоча б одна зі змінних $a або $b істина (можливо, що й обидві)

$a or $b

||

Або

 

$a || $b

Xor

Що виключає або

Одна зі змінних істина. Випадок, коли вони обидві істині, виключається

$a xor $b

!

Інверсія (NOT)

Якщо $a=True, то !$a=False і навпаки

! $a

 

Таблиця 5. Оператори порівняння

Позначення

Назва

Опис

Приклад

==

Рівність

Значення змінних рівні

$a == $b

===

Еквівалентність

Рівні значення і типи змінних

$a === $b

!=

Нерівність

Значення змінних не рівні

$a != $b

<> 

Нерівність

 

$a <> $b

!==

Нееквівалентність

Змінні не еквівалентні

$a !== $b

Менше

 

$a < $b

Більше

 

$a > $b

<=

Менше або дорівнює

 

$a <= $b

>=

Більше або дорівнює

 

$a >= $b

 

Таблиця 6. Оператори інкремента й декремента

Позначення

Назва

Опис

Приклад

++$a

Пре-Інкремент

Збільшує $a на одиницю й повертає $a

 

$a++

Пост-інкремент

Повертає $a, потім збільшує $a на одиницю

 

--$a

Пре-декремент

Зменшує $a на одиницю й повертає $a

 

$a--

Пост-декремент

Повертає $a, потім зменшує $a на одиницю

 

 

Типи даних

PHP підтримує вісім простих типів даних.

Чотири скалярних типи:

  • boolean (логічні дані)
  • integer (цілі числа)
  • float (число з плаваючою крапкою або 'double')
  • string (рядки)

Два змішаних типу:

  • array (масиви)
  • object (об'єкти)

І два спеціальних типи:

  • resource (ресурси)
  • NULL (порожній тип)

Існують також кілька псевдотипів:

  • mixed (змішаний тип)
  • number (числа)
  • callback (зворотного виклику)

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

 

Тип boolean (логічний тип)

Цей найпростіший тип, що висловлює істинність значення, тобто змінна цього типу може мати лише два значення - істина TRUE або брехня FALSE.

Щоб визначити логічний тип, використовують ключове слово TRUE або FALSE. Обидва регістронезалежні.

Приклад 4. Логічний тип

<? Php   
$Test = True;  
?>

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

Приклад 5. Використання логічного типу

<? Php  
// Оператор '==' перевіряє рівність        
// І повертає       
// Булеве значення       
if ($ know == False) {// якщо $know       
// Має значення  
// False       
echo "Вивчай PHP!";   
}       
if (!$know) {/ / те ж саме, що
// І вище, тобто перевірка    
// Чи має $know значення    
// False       
echo "Вивчай PHP!";   
}       
/* Оператор == перевіряє, чи збігається         
значення змінної $know з рядком
"Вивчити PHP". Якщо співпадає, то      
повертає true, інакше - false.
Якщо повернуто true, то виконується   
те, що всередині фігурних дужок * /     
if ($know == "Вивчити PHP")       
{Echo "Почав вивчати";}     
?>

 

Тип integer (цілі)

Цей тип задає число з множини цілих чисел Z = {..., -2, -1, 0, 1, 2, ...}. Цілі можуть бути вказані у десятковій, шістнадцятковій або вісімковій системі числення, за бажанням з попереднім знаком «-» або «+».

Якщо ви використовуєте вісімкову систему числення, ви повинні перед числом ставити 0 (нуль), для використання шістнадцяткової системи потрібно поставити перед числом 0x.

<? Php  
# Десяткове число   
$A = 1234;     
# Від'ємне число     
$A = -123;      
# Вісімкове число (еквівалентно        
# 83 у десятковій системі)
$A = 0123;     
# Шістнадцяткове число (еквівалентно       
# 26 у десятковій системі)
$A = 0x1A;     
?>

Розмір цілого залежить від платформи, хоча, як правило, максимальне значення близько двох мільярдів (це 32-бітове знакове). Беззнакові цілі PHP не підтримує.

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

У PHP не існує оператора ділення цілих. Результатом 1/2 буде число з плаваючою крапкою 0.5. Ви можете навести значення до цілого, що завжди округлює його в меншу сторону, або використовувати функцію round (), округлюються значення за стандартними правилами. Для перетворення змінної до конкретного типу потрібно перед змінною вказати в дужках потрібний тип. Наприклад, для перетворення змінної $a = 0.5 до цілого типу необхідно написати (integer) (0.5) або (integer) $a або використовувати скорочений запис (int) (0.5). Можливість явного приведення типів за таким принципом існує для всіх типів даних (звичайно, не завжди значення одного типу можна перевести в інший тип). Ми не будемо заглиблюватися у всі тонкощі приведення типів, оскільки PHP робить це автоматично залежно від контексту.

 

Тип float (числа з плаваючою крапкою)

Числа з плаваючою крапкою (вони ж числа подвійної точності або дійсні числа) можуть бути визначені за допомогою будь-якого з наступних синтаксисів:

<? Php  
$ A = 1.234;   
$ B = 1.2e3;    
$ C = 7E-10;   
?>

Розмір числа з плаваючою крапкою залежить від платформи, хоча максимум, як правило, ~ 1.8e308 з точністю близько 14 десяткових цифр.

Тип string (рядки)

Рядок - це набір символів. У PHP символ - це те ж саме, що байт, це означає, що існує рівно 256 різних символів. Це також означає, що PHP не має вбудованої підтримки Unicode. У PHP практично не існує обмежень на розмір рядків, тому немає абсолютно ніяких причин турбуватися про їх довжину.

Рядок у PHP може бути визначений трьома різними способами:

  • за допомогою одинарних лапок;
  • за допомогою подвійних лапок;
  • heredoc-синтаксисом.

Одинарні лапки

Найпростіший спосіб визначити рядок - це розмістити його в одинарні лапки «'». Щоб використовувати одинарні лапки всередині рядка, як і в багатьох інших мовах, перед нею необхідно поставити символ зворотної косої межі «\», тобто екранувати її. Якщо зворотній слеш повинен йти перед одинарними лапками або бути в кінці рядка, необхідно продублювати його «\\ '».

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

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

Приклад 6. Використання керуючих послідовностей

<? Php
echo 'Також ви можете додавати до рядка
символ нового рядка таким чином,
це нормально ';
// Виведе: Щоб вивести ' треба
// Перед нею поставити \
echo 'Щоб вивести \' треба перед '.
'Нею поставити \\'; 
// Виведе: Ви хочете видалити C: \ *.*?
echo 'Ви хочете видалити C: \ \ *.*?';
// Виведе: Це не вставить: \ n новий рядок
echo 'Це не вставить: \ n новий рядок';
// Виведе: Змінні $ expand також
// $Either не підставляються
echo 'Змінні $ expand також $ either'.
'Не підставляються';
?>

Подвійні лапки

Якщо рядок помістити у подвійні лапки «" », то PHP розпізнає більшу кількість керуючих послідовностей для спеціальних символів. Деякі з них наведені в таблиці 7.

Послідовність

Значення

\n

Новий рядок (LF або 0x0A (10) в ASCII)

\r

Повернення каретки (CR або 0x0D (13) в ASCII)

\t

Горизонтальна табуляція (HT або 0x09 (9) в ASCII)

\\

Зворотній слеш

\$

Знак долара

\"

Подвійна лапки

Найважливішою властивістю рядків у подвійних лапках є обробка змінних.

Heredoc

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

Heredoc-текст веде себе так само, як і рядок в подвійних лапках, при цьому їх не маючи. Це означає, що вам немає необхідності екранувати лапки в heredoc, але ви як і раніше можете використовувати перераховані вище керуючі послідовності. Змінні всередині heredoc теж обробляються.

Приклад 7. Використання heredoc-синтаксису 
<? Php 
$Str = <<
Приклад рядка, що охоплює кілька 
рядків, з використанням 
heredoc-синтаксису 
EOD; 
// Тут ідентифікатор – EOD використовується як маркер завершення даних.

$Name = 'Вася'; 
echo <<
Мене звуть "$name". 
EOD; 
// Це виведе "Мене звуть" Вася ". 
?> 

 

Зауваження: Підтримка heredoc була додана з PHP 4. 

 

Тип array (масив)

Масиви (arrays) - це впорядковані набори даних, що представляють собою список однотипних елементів.

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

  1. У масивах першого типу елемент визначається індексом у послідовності. Такі масиви називаються простими масивами.
  2. Масиви другого типу мають асоціативну природу, і для звернення до елементів використовуються ключі, логічно пов'язані зі значеннями. Такі масиви називають асоціативними масивами.

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

Масиви можуть бути як одновимірними, так і багатовимірними.

Прості масиви та списки в PHP

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

Прості одномірні масиви:

Узагальнений синтаксис елементів простого одновимірного масиву:

$Ім'я [індекс];

Масиви, індексами яких є числа, які починаються з нуля – це списки:

<? Php  
/ / Простий спосіб ініціалізації масиву        
$Names [0] = "Апельсин";         
$Names [1] = "Банан";      
$Names [2] = "Груша";    
$Names [3] = "Помідор"; 
// Тут: Names - ім'я масиву, а 0, 1, 2, 3 - індекси масиву        
?>

Доступ до елементів простих масивів (списків) здійснюється наступним чином:

<? Php 
// Простий спосіб ініціалізації масиву 
$Names [0] = "Апельсин"; 
$Names [1] = "Банан"; 
$Names [2] = "Груша"; 
$Names [3] = "Помідор"; 
// Тут: Names - ім'я масиву, а 0, 1, 2, 3 - індекси масиву 

/ /Виведемо елементи масивів в браузер: 
echo $Names [0]; // Значення елемента масиву names з індексом 0 
echo $Names [3]; // Значення елемента масиву names з індексом 3 
// Виводить: 
// Апельсин 
// Помідор 
?>

З технічної точки зору різниці між простими масивами і списками немає.

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

<? Php 
// Простий спосіб ініціалізації масиву, без вказівки індексів 
$Names [] = "Апельсин"; 
$Names [] = "Банан"; 
$Names [] = "Груша"; 
$Names [] = "Помідор"; 
// PHP автоматично присвоїть індекси елементів масиву, починаючи з 0 

// Виводимо елементи масивів в браузер: 
echo $Names [0]; // Висновок елемента масиву names з індексом 0 
echo $Names [3]; // Висновок елемента масиву names з індексом 3 
// Виводить: 
// Апельсин 
// Помідор 
?>

У розглянутому прикладі ви можете додавати елементи масиву Names простим способом, тобто не вказуючи індекс елемента масиву:

$Names [] = "Яблуко";

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

Прості багатовимірні масиви:

Узагальнений синтаксис елементів багатовимірного простого масиву:

$Ім'я [індекс1] [індекс2] .. [індексN];

Приклад простого багатовимірного масиву:

<? Php 
// Багатомірний простий масив: 
$Arr [0] [0] = "Овочі"; 
$Arr [0] [1] = "Фрукти"; 
$Arr [1] [0] = "Абрикос"; 
$Arr [1] [1] = "Апельсин"; 
$Arr [1] [2] = "Банан"; 
$Arr [2] [0] = "Огірок"; 
$Arr [2] [1] = "Помідор"; 
$Arr [2] [2] = "Гарбуз"; 

// Виводимо елементи масиву: 
echo "<h3>". $Arr [0] [0 ].":</ h3> "; 
for ($q = 0; $q <= 2; $q + +) { 
echo $Arr [2] [$ q]. ""; 

echo "<h3>". $Arr [0] [1 ].":</ h3> "; 
for ($w = 0; $w <= 2; $w + +) { 
echo $Arr [1] [$ w]. "<br>"; 

?> 

Асоціативні масиви в PHP

У PHP індексом масиву може бути не тільки число, але і рядок. Причому на такий рядок не накладаються ніякі обмеження: він може містити пробіли, довжина такого рядка може бути будь-яка.

Асоціативні масиви особливо зручні в ситуаціях, коли елементи масиву зручніше пов'язувати зі словами, а не з числами.

Отже, масиви, індексами яких є рядки, називаються асоціативними масивами.

Одномірні асоціативні масиви:

Одномірні асоціативні масиви містять тільки один ключ (елемент), відповідний конкретному індексу асоціативного масиву. Наведемо приклад:

<? Php 
// Асоціативний масив 
$Names ["Іванов"] = "Іван"; 
$Names ["Сидоров"] = "Микола"; 
$Names ["Петров"] = "Петро"; 
// У даному прикладі: прізвища - ключі асоціативного масиву 
//, А імена - елементи масиву Names 
?>

Доступ до елементів одновимірних асоціативних масивів здійснюється так само, як і до елементів звичайних масивів, і називається доступом по ключу:

echo $Names ["Іванов"];

Багатовимірні асоціативні масиви:6

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

<? Php 
// Багатомірний масив 
$A ["Ivanov"] = array ("name" => "Іванов І.І.", "age" => "25", "email" => "ivanov@mail.ru"); 
$A ["Petrov"] = array ("name" => "Петров П.П.", "age" => "34", "email" => "petrov@mail.ru"); 
$A ["Sidorov"] = array ("name" => "Сидоров С.С.", "age" => "47", "email" => "sidorov@mail.ru"); 
?>

Багатовимірні масиви схожі на записи у мові Pascal або структури в мові C.

Доступ до елементів багатовимірного асоціативного масиву здійснюється наступним чином:

echo $A ["Ivanov"] ["name"]; // Виводить Іванов І.І. 
echo $A ["Petrov"] ["email"]; // Виводить petrov@mail.ru

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

Асоціативні багатовимірні масиви можна створювати і класичним способом, хоча це не так зручно:

<? Php 
// Багатомірний асоціативний масив 
$A ["Ivanov"] ["name"] = "Іванов І.І."; 
$A ["Ivanov"] ["age"] = "25"; 
$A ["Ivanov"] ["email"] = "ivanov@mail.ru"; 

$A ["Petrov"] ["name"] = "Петров П.П."; 
$A ["Petrov"] ["age"] = "34"; 
$A ["Petrov"] ["email"] = "petrov@mail.ru"; 

$A ["Sidorov"] ["name"] = "Сидоров С.С."; 
$A ["Sidorov"] ["age"] = "47"; 
$A ["Sidorov"] ["email"] = "sidorov@mail.ru"; 

// Отримуємо доступ до ключів багатовимірного асоціативного масиву 
echo $A ["Ivanov"] ["name "]."< br>"; // Виводить Іванов І.І. 
echo $A ["Sidorov"] ["age "]."< br>"; // Виводить 47 
echo $A ["Petrov"] ["email "]."< br>"; // Виводить petrov@mail.ru 
?>

Тип object (об'єкти)

Об'єкти - тип даних, що прийшов з об'єктно-орієнтованого програмування (ООП). Згідно з принципами ООП, клас - це набір об'єктів, що володіють певними властивостями і методами роботи з ним, а об'єкт відповідно - екземпляр класу. Наприклад, програмісти - це клас людей, які пишуть програми, вивчають комп'ютерну літературу і, крім того, як всі люди, мають ім'я та прізвище. Тепер, якщо взяти одного конкретного програміста, Васю Іванова, то можна сказати, що він є об'єктом класу програмістів, має ті ж властивості, що й інші програмісти, теж має ім'я, пише програми і т.п.

У PHP для доступу до методів об'єкта використовується оператор ->. Для ініціалізації об'єкту використовується вираз new, що створює в змінній екземпляр об'єкта.

Приклад 8. Об'єкти в PHP

<? Php 
// Створюємо клас людей 
class Person 

// Метод, який навчає людину PHP 
function know_php () 

echo "Тепер я знаю PHP"; 


$Bob = new Person; // створюємо об'єкт 
// Класу людина 
$ Bob -> know_php (); // навчаємо його PHP 
?>

Більш докладно реалізацію принципів ООП в мові PHP ми розглянемо в одній з наступних лекцій.

 

Тип resource (ресурси)

Ресурс - це спеціальна змінна, що містить посилання на зовнішній ресурс (наприклад, з'єднання з базою даних). Ресурси створюються та використовуються спеціальними функціями (наприклад, mysql_connect (), pdf_new () і т.п.).

Тип Null

Спеціальне значення NULL говорить про те, що змінна не має значення.

Змінна вважається NULL, якщо:

  • їй була присвоєна константа NULL ($var = NULL);
  • їй ще не було присвоєно будь-яке значення;
  • вона була вилучена за допомогою unset ().

Існує тільки одне значення типу NULL - регістронезалежне ключове слово NULL.

Керуючі конструкції

Умовні оператори

Оператор if

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

if (вираз) блок_виконання

Тут вираз є будь-який правильний PHP-вираз (тобто все, що має значення). У процесі обробки скрипта вираз перетвориться до логічного типу. Якщо в результаті перетворення значення виразу істинно (True), то виконується блок_виконання. В іншому випадку блок_виконання ігнорується. Якщо блок_виконання містить кілька команд, то він повинен бути укладений у фігурні дужки {}.

Правила перетворення виразу до логічного типу: 
1. Правила перетворення виразу до логічного типу:

  • логічне False
  • цілий нуль (0)
  • дійсний нуль (0.0)
  • порожній рядок і рядок "0"
  • масив без елементів
  • об'єкт без змінних (детально про об'єкти буде розказано в одній з наступних лекцій)
  • спеціальний тип NULL

 

2. Всі інші значення перетворюються в TRUE.

 

Приклад 9. Умовний оператор if

<? 
$Names = array ("Іван", "Петро", "Семен"); 
if ($Names[0] == "Іван") { 
echo "Привіт, Ваня!"; 
$Num = 1; 
$Account = 2000; 

if ($num) echo "Іван перший у списку!"; 
$Bax = 30; 
if ($Account > 100 * $Bax +3) 
echo "Цей рядок не з'явиться 
на екрані, так як умова не виконана "; 
?>

 

Оператор else

Ми розглянули тільки одну, основну частину оператора if. Існує кілька розширень цього оператора. Оператор else розширює if на випадок, якщо вираз, що перевіряється в if є невірним, і дозволяє виконати будь-які дії за таких умов.

Структуру оператора if, розширеного за допомогою оператора else, можна представити таким чином:

if (вираз) блок_виконання
else блок_виконання1

Цю конструкцію if ... else можна інтерпретувати приблизно так: якщо виконана умова (тобто вираз = true), то виконуємо дії з блоку_виконання, інакше - дії з блоку_виконання1. Використовувати оператор else не обов'язково.

Подивимося, як можна змінити попередній приклад, з огляду на необхідність здійснення дій в разі невиконання умови.

Приклад 10. Оператор else

<? 
$Names = array ("Іван", "Петро", "Семен"); 
if ($Names [0] == "Іван") { 
echo "Привіт, Ваня!"; 
$Num = 1; 
$Account = 2000; 
}Else { 
echo "Привіт, $Names [0]. 
А ми чекали Ваню: ("; 

if ($Num) echo "Іван перший у списку!"; 
else echo "Іван НЕ перший у списку?!"; 
$Bax = 30; 
if ($Account > 100 * $ bax +3) 
echo "Цей рядок не з'явиться на екрані, 
так як умова не виконана "; 
else echo "Зате з'явиться цей рядок!"; 
?> 
 

Оператор elseif

Ще один спосіб розширення умовного оператора if - використання оператора elseif. Еlseif - це комбінація else і if. Як і else, він розширює if для виконання різних дій у тому випадку, якщо умова, що перевіряється в if, невірно. Але на відміну від else, альтернативні дії будуть виконані, тільки якщо elseif-умова є вірним. Структуру оператора if, розширеного за допомогою операторів else і elseif, можна представити таким чином:

if (вираз) блок_виконання

elseif (вираз1) блок_виконання1

...

else блок_ виконанняN

Операторів elseif може бути відразу кілька в одному if-блоці. Elseif-твердження буде виконано, тільки якщо попереднє if-умова є False, всі попередні elseif-умови є False, а дане elseif-умова - True.

Приклад 11. Оператор elseif

<? 
$Names = array ("Іван", "Петро", "Семен"); 
if ($Names [0] == "Іван") { 
// Якщо перше ім'я в масиві Іван 
echo "Привіт, Ваня!"; 
} Elseif ($Names [0] == "Петро") { 
// Якщо перше ім'я 
// Не Іван, а Петро 
echo "Привіт, Петя!"; 
} Elseif ($Names [0] == "Семен") { 
// Якщо перше ім'я не 
// Іван, не Петро, а Семен 
echo "Привіт, Сеня!"; 
} Else { 
// Якщо перше ім'я не Іван, 
// Не Петро І не Семен 
echo "Привіт, $ Names [0]. А ти хто такий?"; 

?> 
 

Оператор switch

Ще одна конструкція, що дозволяє перевіряти умови і виконувати в залежності від цього різні дії, - це switch. У залежності від того, яке значення має змінна, він перемикається між різними блоками дії. switch дуже схожий на оператор if ... elseif ... else або набір операторів if. Структуру switch можна записати наступним чином:

switch (вираз чи змінна) { 
case значення1: 
блок_дій1 
break; 
case значення2: 
блок_дій2 
break;
 ... 
default: 
блок_дій_при_замовчуванні 
}

На відміну від if, тут значення виразу не приводиться до логічного типу, а просто порівнюється зі значеннями, перерахованими після ключових слів case (значення1, значення2 і т.д.). Якщо значення виразу співпало з якимсь варіантом, то виконується відповідний блок_дій - від двокрапки після значення, що співпало до кінця switch або до першого оператора break, якщо такий знайдеться. Якщо значення виразу не співпало з жодним із варіантів, то виконуються дії за умовчанням (блок_дій_при_замовчуванні), що знаходяться після ключового слова default. Вираз в switch обчислюється тільки один раз, а в операторі elseif - кожен раз, тому, якщо вираз досить складний, то switch працює швидше.

Приклад 11 можна переписати з використанням switch наступним чином:

<? 
$ Names = array ("Іван", "Петро", "Семен"); 
switch ($Names [0]) { 
case "Іван": 
echo "Привіт, Ваня!"; 
break; 
case "Петро": 
echo "Привіт, Петя!"; 
break; 
case "Семен": 
echo "Привіт, Сеня!"; 
break; 
default: 
echo "Привіт, $Names [0]. 
А як Вас звати? "; 
} ?>

Якщо в цьому прикладі опустити оператор break, наприклад, в case "Петро":, то, якщо змінна виявиться рівною рядку "Петро", після виведення на екран повідомлення "Привіт, Петя!" програма піде далі і виведе також повідомлення "Привіт, Сеня!" і тільки потім, зустрівши break, продовжить своє виконання за межами switch.

Для конструкції switch, як і для if, можливий альтернативний синтаксис, де відкривається switch фігурна дужка замінюється двокрапкою, а закриває - endswitch; відповідно.

 

Цикли

У PHP існує кілька конструкцій, що дозволяють виконувати повторювані дії в залежності від умови. Це цикли while, do .. while, foreach та for. Розглянемо їх більш докладно.

while

Структура: 
while (вираз) {блок_виконання} 
або 
while (вираз): блок_виконання endwhile;

While - простий цикл. Він наказує PHP виконувати команди блоку_виконання до тих пір, поки вираз обчислюється як True (тут, як і в if, відбувається приведення вислову до логічного типу). Значення виразу перевіряється щоразу на початку циклу, так що, навіть якщо його значення змінилося в процесі виконання блоку_виконання, цикл не буде зупинено до кінця ітерації (тобто поки всі команди блоку_виконання не будуть виконані).

Приклад 12. Оператор while

<? 
// Ця програма надрукує всі парні цифри 
$I = 1; 
while ($I <10) { 
if ($I % 2 == 0) print $ i; 
// Друкуємо цифру, якщо вона парна 
$I + +; 
// І збільшуємо $I на одиницю 

?>

do ... while

Цикли do .. while дуже схожі на цикли while, з тією лише різницею, що істинність висловлювання перевіряється наприкінці циклу, а не на початку. Завдяки цьому блок_виконання циклу do ... while гарантовано виконується хоча б один раз.

Структура: 
do {блок_виконання} while (вираз); 
Приклад 13. Оператор do .. while

// Ця програма надрукує число 12, незважаючи на те 
// Що умова циклу не виконано 
$I = 12; 
do { 
if ($I % 2 == 0) print $I; 
// Якщо число парне, то друкуємо його 
$I++; 
// Збільшуємо число на одиницю 
} While ($I <10)
?>

for

Це найскладніші цикли в PHP. Вони нагадують відповідні цикли C.

Структура: 
for (вираз1; вираз2; вираз3) {блок_виконання} 
або 
for (вираз1; вираз2; вираз3): блок_виконання endfor;

Тут, як ми бачимо, умова складається одразу з трьох виразів. Перший вираз вираз1 обчислюється безумовно один раз на початку циклу. На початку кожної ітерації обчислюється вираз2. Якщо він є True, то цикл продовжується і виконуються всі команди блоку_виконання. Якщо вираз2 обчислюється як False, то виконання циклу зупиняється. В кінці кожної ітерації (тобто після виконання всіх команд блоку_виконання) обчислюється вираз3.

Кожне з виразів 1, 2, 3 може бути порожнім. Якщо вираз2 є порожнім, то це значить, що цикл повинен виконуватися невизначений час (у цьому випадку PHP вважає це вираз завжди істинним). Це не так марно, як здається, адже цикл можна зупиняти, використовуючи оператор break.

Наприклад, всі парні цифри можна вивести з використанням циклу for таким чином:

<? Php 
for ($i = 0; $ i <10; $i + +) { 
if ($i% 2 == 0) print $i; 
// Друкуємо парні числа 
} ?>

Якщо опустити другий вираз (умова $ i <10), то таку ж задачу можна вирішити, зупиняючи цикл оператором break.

< ? Php 
for ($i = 0;; $ i + +) { 
if ($i> = 10) break; 
// Якщо $i більше або дорівнює 10, 
// То припиняємо роботу циклу 
if ($i% 2 == 0) print $ i; 
// Якщо число парне, 
// То друкуємо його 
} ?>

Можна опустити всі три вирази. У цьому випадку просто не буде задано початкове значення лічильника $i і воно не буде змінюватися кожного разу наприкінці циклу. Всі ці дії можна записати у вигляді окремих команд або в блоці_виконання, або перед циклом:

<? Php 
$і = 2; // задаємо початкове значення лічильника 
for (;;) { 
if ($i> = 10) break; 
// Якщо $i більше або дорівнює 10, 
// То припиняємо роботу циклу 
if ($ i% 2 == 0) print $i; 
// Якщо число парне, 
// То друкуємо його 
$і+ +; // збільшуємо лічильник на одиницю 
}
?>

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

<? Php 
for ($i = 0; $i <10; print $i, $i + +) 
/ * Якщо блок_виконання не містить команд 
або містить тільки одну команду, 
фігурні дужки, в які він укладений, 
можна опускати * / 
?>

foreach

Ще одна корисна конструкція. Вона з'явилася тільки в PHP4 і призначена виключно для роботи з масивами.

Синтаксис: 
foreach ($array as $value) {блок_виконання} 
або 
foreach ($array as $key => $value) 
{Блок_виконання}

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

Друга форма запису на додаток до перерахованого вище на кожному кроці циклу записує ключ поточного елемента масиву в змінну $key, яку теж можна використовувати в блоці_виконання.

Приклад 14. Оператор foreach

Коли foreach починає виконання, внутрішній покажчик масиву автоматично встановлюється на перший елемент.

<? Php 
$Names = array ("Іван", "Петро", "Семен"); 
foreach ($Names as $ val) { 
echo "Привіт, $val <br>"; 
// Виведе всім вітання 

foreach ($Names as $k => $val) { 
// Крім привітання, 
// Виведемо номера в списку, тобто ключі 
echo "Привіт, $val! 
Ти в списку під номером $k <br> "; 

?> 
 

Оператори передачі управління

Іноді потрібно негайно завершити роботу циклу або окремої його ітерації. Для цього використовують оператори break та continue.

Break

Приклад 15. Оператор break

<? Php 
$I = 1; 
while($ i) { 
$N = rand (1,10); 
// Генеруємо довільне число 
// Від 1 до 10 
echo "$I: $N "; 
// Виводимо номер ітерації і 
// Згенероване число 
if ($N == 5) break; 
/* Якщо було створене число 5, 
то припиняємо роботу циклу. У цьому випадку 
все, що знаходиться після цього рядка 
всередині циклу, не буде виконана * / 
echo "Цикл працює <br>"; 
$I++; 

echo "<br> Число ітерацій циклу $ i"; ?>

Результатом роботи цього скрипта буде приблизно наступне: 
1:7 Цикл працює
2:2 Цикл працює
3:5
Число ітерацій циклу 3
Трохи змінимо наш скрипт:

<? Php 
$i = 1; 
while ($i) { 
$n = rand (1,10); 
// Генеруємо довільне число 
// Від 1 до 10 
switch ($n) { 
case 5: 
echo "<font color=blue> 
Вихід з switch (n = $n) "; 
break 1; 
// Припиняємо роботу switch 
// (Один break циклу) 
case 10: 
echo "<font color=red> 
Вихід з switch і 
while (n = $n) "; 
break 2; 
// Припиняємо роботу switch і while 
// (Два break циклів) 
default: 
echo "switch працює (n = $n),"; 

echo "while працює - крок $i <br>"; 
$i+ +; 

echo "<br> Число ітерацій циклу $i"; 
?>

continue

Іноді потрібно не повністю припинити роботу циклу, а тільки почати його нову ітерацію. Оператор continue дозволяє пропустити подальші інструкції з блоку_виконання будь-якого циклу і продовжити виконання з нового кола. continue можна використовувати з числовим аргументом, який вказує, скільки ітерацій циклу повинні завершити роботу.

Замінимо в прикладі попереднього параграфа оператор break на continue. Крім того, обмежимо кількість кроків циклу трьома.

<? Php 
$i = 1; 
while ($i <= 4) { 
$n = rand (1,10); 
// Генеруємо довільне число 
// Від 1 до 10 
echo "$i: $n"; 
// Виводимо номер ітерації і 
// Згенероване число 
if ($ n == 5) { 
echo "Нова ітерація <br>"; 
continue; 

/* Якщо було створене число 5, 
то починаємо нову ітерацію циклу, 
$і не збільшується */ 

echo "Цикл працює <br>"; 
$і+ +; 

$і--; 
echo "<br> Число ітерацій циклу $ i"; 
?>

Результатом роботи цього скрипта буде 
1:10 Цикл працює 
2:5 Нова ітерація 
2:1 Цикл працює 
3:1 Цикл працює 
Число ітерацій циклу 4

Зауважимо, що після виконання оператора continue робота циклу не закінчується. У прикладі лічильник циклу не змінюється в разі отримання числа 5, оскільки він перебуває після оператора continue. Фактично за допомогою continue ми намагаємося уникнути ситуації, коли буде створене число 5. Тому можна було просто написати, замінивши оператор continue на перевірку істинності висловлювання:

<? Php 
$I = 1; 
while ($I <4) { 
$N = rand (1,10); 
// Генеруємо довільне число 
// Від 1 до 10 
if ($N! == 5) { 
echo "$ i: $ n <br>"; 
// Виводимо номер ітерації 
// І згенероване число 
$I + +; 


?>

У PHP існує одна особливість використання оператора continue - в конструкціях switch він працює так само, як і break. Якщо switch знаходиться всередині циклу й треба почати нову ітерацію циклу, слід використовувати continue 2.

 

Оператори включення

include

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

include 'ім'я_файлу'; 
include $file_name; 
include ("ім'я_файлу");

Приклад 16. Нехай у файлі params.inc у нас зберігається набір якихось параметрів і функцій. Кожного разу, коли нам потрібно буде використовувати ці параметри (функції), ми будемо додавати до тексту нашої основної програми команду include 'params.inc'.

Приклад 16. Використання оператора включення include

params.inc 

<? Php 
$User = "Вася"; 
$Today = date ("d.m.y"); 
/ * Функція date () повертає дату 
і час (тут - дату в форматі 
день.місяць.рік) * / 
?> 

include.php

 <? Php 
include ("params.inc"); 
/* Змінні $User і $Today задані у файлі 
params.inc. Тут ми теж можемо ними 
користуватися завдяки команді 
include ("params.inc") * / 

echo "Привіт, $User! <br>"; 
// Виведе "Привіт, Вася!" 
echo "Сьогодні $Today"; 
// Виведе, наприклад, "Сьогодні 24.01.11"
?>

Зауважимо, що використання оператора include еквівалентно простий вставці змістовної частини файлу params.inc в код програми include.php. Справа в тому, що в момент вставки файлу відбувається перемикання з режиму обробки PHP в режим HTML. Тому код всередині файлу, який потрібно обробити як PHP-скрипт, повинен бути укладений у відповідні теги.

Пошук файлу для вставки відбувається за такими правилами.

  1. Спочатку ведеться пошук файлу в include_path поточної робочої директорії.
  2. Якщо файл не знайдений, то пошук виконується в include_path директорії поточного скрипта.
  3. Параметр include_path, визначається у файлі налаштувань PHP, задає імена директорій, в яких потрібно шукати файли, що включаються.

Наприклад, ваш include_path це поточна робоча директорія - / www /. В основний файл include.php ви включаєте файл my_dir / a.php, який у свою чергу включає b.php. Тоді парсер насамперед шукає файл b.php в директорії / www /, і якщо такого немає, то в директорії / www / my_dir /.

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

Приклад 17. Область видимості при використанні include .Нехай файл для вставки params.inc залишиться таким же, а include.php буде наступним:

<? Php 
function Footer () { 
// Оголошуємо функцію з ім'ям Footer 
include ("params.inc"); 
/* Включаємо файл params.inc. 
Тепер його змінними можна користуватися, 
але тільки всередині функції */ 
$str = "Сьогодні: $today <br>"; 
$str .= "<a 
href = 'mailto: help@intuit.ru'> Сторінку 
створив $user "; 
echo "$str"; 

Footer(); 
// Викликаємо функцію Footer (). Отримаємо: 
// Сьогодні: 08.07.05 
// Сторінку створив Вася 

echo "$user, $today"; 
// Нічого не виведе, так як 
// Ці змінні видно тільки 
// Всередині функції
 ?> 

Крім локальних файлів, за допомогою include можна включати і зовнішні файли, вказуючи їх url-адреси. Дана можливість контролюється директивою url_fopen_wrappers у файлі налаштувань PHP і за замовчуванням, як правило, включена. Але у версіях PHP для Windows до PHP 4.3.0 ця можливість не підтримується зовсім, незалежно від url_fopen_wrappers.

include () - це спеціальна мовна конструкція, тому при використанні всередині блоків її потрібно укладати у фігурні дужки.

Приклад 18. Використання include ()

<? Php 
/* Це невірний запис. Отримаємо помилку. 
Ми ж вставляємо не одну команду, 
а декілька, вони тільки записані 
в іншому файлі */ 
if ($condition) include ("first.php"); 
else include ("second.php"); 
// А ось так правильно. 
if ($ condition) {include ("first.php");} 
else {include ("second.php");} 
?> 
 

При використанні include можливо два види помилок - помилка вставки (наприклад, не можна знайти вказаний файл, невірно написана сама команда вставки тощо) або помилка виконання (якщо помилка міститься у файлі, що вставляється). У будь-якому випадку при помилці в команді include виконання скрипта не завершується.

require

Цей оператор діє приблизно так само, як і #include в C+ +. Все, що ми говорили про include, лише за деякими винятками, справедливо і для require. require також дозволяє включати в програму і виконувати який-небудь файл. Основна відмінність require і include полягає в тому, як вони реагують на виникнення помилки. Як вже говорилося, include видає попередження, і робота скрипта триває. Помилка в require викликає фатальну помилку роботи скрипта і припиняє його виконання.

Умовні оператори на require () не впливають. Якщо рядок, в якому з'являється цей оператор, не виконується, то жоден рядок коду з файлу теж не виконується. Цикли також не впливають на require (). Код, що міститься у файлі який є об'єктом циклу,вставляється але вставка відбувається тільки один раз.

У реалізаціях PHP до версії 4.0.2 використання require () означало, що інтерпретатор обов'язково спробує прочитати файл.

require, як і include, при використанні всередині умовних блоків потрібно укладати у фігурні дужки.

Альтернативний синтаксис

PHP пропонує альтернативний синтаксис для деяких своїх керуючих структур, а саме для if, while, for, foreach і switch. У кожному разі відкриваючу фігурну дужку потрібно замінити на двокрапку (:), а закриваючу - на endif;, endwhile, і т.д. відповідно.

Наприклад, синтаксис оператора if можна записати таким чином: 
if (вираз): блок_виконання endif;

Сенс залишається тим же: якщо умова, що записана в круглих дужках оператора if, виявилась істиною, буде виконуватися весь код, від двокрапки ":" до команди endif;. Використання такого синтаксису корисно при встроюванні php в html-код.

Приклад 19. Використання альтернативного синтаксису

<? Php 
$ Names = array ("Іван", "Петро", "Семен"); 
if ($Names [0] == "Іван"): 
?> 
Привіт, Ваня! 
<? Php 
endif;
?>

Якщо використовуються конструкції else і elseif, то також можна задіяти альтернативний синтаксис:

<? Php 
$a = 1; 
if ($a == 5): 
print "a дорівнює 5"; 
print "..."; 
elseif ($ a == 6): 
print "a дорівнює 6"; 
print "!!!"; 
else: 
print "a не дорівнює ні 5, ні 6"; 
endif; 
?>

Функції користувача

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

Функція обчислення факторіала натурального числа

<? Php 
function fact ($n) { 
if ($n == 0) return 1; 
else return $fact = $ n * fact ($ n-1); 

echo fact (3); 
// Можна було б написати echo (3 * 2); 
// Але якщо число велике, 
echo fact (50); 
// То зручніше користуватися функцією, 
// Ніж писати echo (50 * 49 * 48 *...* 3 * 2); 
?>

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

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

function Імя_функціі (параметр1, параметр2, ... параметрN) { 
Блок_дій 
return "значення повертається функцією"; 
}

Якщо прямо так написати в php-програмі, то працювати нічого не буде. По-перше, Імя_функції і імена параметрів функції (параметр1, параметр2 і т.д.) повинні відповідати правилам найменування в PHP (і українських символів в них краще не використовувати). Імена функцій нечутливі до регістру. По-друге, параметри функції - це змінні мови, тому перед назвою кожної з них повинен стояти знак $. Ніяких крапок ставити в списку параметрів не можна. По-третє, замість слів блок_дій в тілі функції повинен знаходитися будь-який правильний PHP-код (не обов'язково залежати від параметрів). І нарешті, після ключового слова return має йти коректний php-вираз (що-небудь, що має значення). Крім того, у функції може і не бути параметрів, як і значення, що повертається. Приклад правильного оголошення функції - функція обчислення факторіала, наведена вище.

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

<? Php 
Імя_функції ("значення_для_параметра1", 
"Значення_для_параметра2 ",...); 
// Приклад виклику функції - виклик функції 
// Обчислення факторіала наведено вище, 
// Там для обчислення факторіала числа 3 
// Ми писали: fact (3); 
// Де fact - ім'я викликається функції, 
// А 3 - значення її параметра з ім'ям $ n 
?>

Коли можна викликати функцію? Функцію можна викликати після її визначення, тобто в будь-якому рядку програми нижче блоку function f_name (){...}. У PHP3 це було дійсно так. Але вже в PHP4 такої вимоги немає. Вся справа в тому, як інтерпретатор обробляє одержуваний код. Єдиний виняток становлять функції, які визначаються умовно (всередині умовних операторів або інших функцій). Коли функція визначається таким чином, її визначення повинно передувати її виклику.

Приклад 20. Визначення функції всередині умовного оператора

<? Php 
$Make = true; 
/* Тут не можна викликати Make_event (); 
тому що вона ще не існує, але можна 
викликати Save_info () * / 

Save_info ("Вася", "Іванов", 
"Я вибрав курс по PHP"); 

if ($Make) { 
// Визначення функції Make_event () 
function Make_event () { 
echo "<p> Хочу вивчати Python <br>"; 


// Тепер можна викликати Make_event () 
Make_event (); 
// Визначення функції Save_info 
function Save_info ($first, $last, $message) { 
echo "<br> $ message <br>"; 
echo "Ім'я:". $first. "". $last. "<br>"; 

Save_info ("Федя", "Федоров", 
"А я вибрав Lisp"); 
// Save_info можна викликати і тут 
?> 

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

Приклад 21. Визначення функції усередині функції

<? Php 
/* Не можна зберегти дані, тобто викликати 
функцію DataSave () до того, як виконана 
перевірка їх правильності, тобто викликана 
функція DataCheck () */ 

DataCheck (); 
DataSave (); 

function DataCheck () { 
// Перевірка правильності даних 
function DataSave () { 
// Зберігаємо дані 


?>

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

Аргументи функцій

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

За допомогою аргументів дані у функцію можна передавати трьома різними способами. Це передача аргументів значенням (використовується за замовчуванням), по посиланню й завдання значення аргументів за замовчуванням. Розглянемо ці способи докладніше.

Коли аргумент передається у функцію за значенням, зміна значення аргументу всередині функції не впливає на його значення поза функцією. Щоб дозволити функції змінювати аргументи, їх потрібно передавати по посиланню. Для цього у визначенні функції перед ім'ям аргументу слід написати знак амперсанд «&».

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

<? Php 
// Напишемо функцію, яка б додавала 
// До рядка слово checked 
function add_label (& $data_str) { 
$data_str .= "checked"; 

$str = "<input type = radio name = article"; 
// Нехай є такий рядок 
echo $str. "> <br>"; 
// Виведе елемент форми - 
// Не вибрану радіо кнопку 
add_label ($str); 
// Викличемо функцію 
echo $ str. "> <br>"; 
// Це виведе вже вибрану 
// Радіо кнопку 
?>

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

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

Приклад 23. Значення аргументів за замовчуванням

<? Php 
function Message ($ sign = "Оргкомітет.") { 
// Тут параметр sign має за замовчуванням значення "Оргкомітет" 
echo "Наступне зібрання відбудеться завтра. <br>"; 
echo $sign. "<br>"; 

Message (); 
// Викликаємо функцію без параметра. 
// У цьому випадку підпис - це Оргкомітет 
Message ("З повагою, Вася"); 
// У цьому випадку підпис 
// Буде "З повагою, Вася." 
?> 
 

Результатом роботи цього скрипта буде:
Наступне зібрання відбудеться завтра. 
Oргкомітет. 
Наступне зібрання відбудеться завтра. 
З повагою, Вася.

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

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

<? Php 
function Add_article ($title, $description, 
$author = "Іванов Іван") { 
echo "Заносимо в каталог статтю: $title,"; 
echo "автор $author"; 
echo "<br> Короткий опис:"; 
echo "$description <hr>"; 

Add_article ("Інформатика і ми", 
"Це стаття про інформатику ...", 
"Петров Петро"); 
Add_article ("Хто такі хакери", 
"Це стаття про хакерів ..."); 
?>

У результаті роботи скрипта одержимо наступне 
Заносимо в каталог статтю: Інформатика і ми, 
автор Петров Петро. 
Короткий опис: 
Це стаття про інформатику ...

Заносимо в каталог статтю: Хто такі хакери, 
автор Іванов Іван. 
Короткий опис: 
Це стаття про хакерів ...

Якщо ж ми напишемо ось так:

<? Php 
function Add_article ($author = "Іванов Іван", 
$title, $description) { 
// ... Дії як у попередньому прикладі 

Add_article ("Хто такі хакери", 
"Це стаття про хакерів ..."); 
?>

То в результаті отримаємо: 
Warning: Missing argument 3 for 
add_article () in 
c: \ users \ nina \ tasks \ func \ def_bad.php 
on line 2

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

В PHP4 можна створювати функції зі змінним числом аргументів. Тобто ми створюємо функцію, не знаючи заздалегідь, зі скількома аргументами її викличуть. Для написання такої функції ніякого спеціального синтаксису не потрібно. Все робиться за допомогою вбудованих функцій func_num_args (), func_get_arg (), func_get_args ().

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

Приклад 24. Використання функції func_num_args ()

<? Php 
function DataCheck () { 
$N = func_num_args (); 
echo "Кількість аргументів функції $N"; 

DataCheck (); 
// Виведе рядок 
// "Число аргументів функції 0" 
DataCheck (1,2,3); 
// Виведе рядок 
// "Число аргументів функції 3" 
?> 
 

Функція func_get_arg (ціле номер_аргумента) повертає аргумент зі списку переданих у функцію аргументів, порядковий номер якого заданий параметром номер_аргумента. Аргументи функції починаються з нуля. Як і func_num_args (), ця функція може використовуватися тільки усередині тіла якої-небудь функції.

Номер_аргумента не може перевищувати число аргументів, переданих у функцію. Інакше буде згенероване попередження, і функція func_get_arg () поверне False.

Створимо функцію для перевірки типу даних її аргументів. Вважаємо, що перевірка пройшла успішно, якщо перший аргумент функції - ціле число, другий - рядок.

Приклад 25. Функція для перевірки типу даних, її аргументів

<? 
function DataCheck () { 
$Check = true; 
$n = func_num_args (); 
// Число аргументів, 
// Переданих у функцію 
/* Перевіряємо, чи є першим 
переданий аргумент цілим числом */ 
if ($ n> = 1) if (! is_int (func_get_arg (0))) 
$Check = false; 
/* Перевіряємо, чи є другий 
переданий аргумент рядком */ 
if ($n> = 2) 
if (!is_string (func_get_arg (1))) 
$Check = false; 
return $Check; 


if (DataCheck (123, "text")) 
echo "Перевірка пройшла успішно <br>"; 
else echo "Дані не задовольняють 
умовам <br> "; 
if (DataCheck (324)) 
echo "Перевірка пройшла успішно <br>"; 
else echo "Дані не задовольняють умовам <br>"; 
?> 

Результатом роботи буде наступне. 
Перевірка пройшла успішно 
Перевірка пройшла успішно

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

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

<? 
function DataCheck () { 
$Check = true; 
$N = func_num_args (); 
// Число аргументів, 
// Переданих у функцію 

$Args = func_get_args (); 
// Масив аргументів функції 
for ($i = 0; $i <$ n; $i + +) { 
$V = $ args [$ i]; 
if($ i% 2 == 0) { 
if(!is_int ($V)) $ check = false; 
// Перевіряємо, 
// Чи є парний аргумент цілим 


return $ check; 

if (DataCheck (array ("text", 324))) 
echo "Перевірка пройшла успішно <br>"; 
else echo "Дані не задовольняють 
умовам <br> "; 
?>

Як бачимо, комбінації функцій func_num_args (), func_get_arg () і func_get_args () використовується для того, щоб функції могли мати змінний список аргументів. Ці функції були додані тільки в PHP 4. У PHP3 для того, щоб домогтися подібного ефекту, можна використовувати в якості аргументу функції масив. Наприклад, ось так можна написати скрипт, який перевіряє, чи є кожен непарний параметр функції цілим числом:

<? 
function DataCheck ($params) { 
$Check = true; 
$N = count ($ params); 
// Число аргументів, 
// Переданих у функцію 

for ($i = 0; $i <$ n; $i + +) { 
$V = $params [$ i]; 
if ($ i% 2! == 0) { 
// Перевіряємо, чи є непарний 
// Аргумент цілим 
if (! is_int ($V)) $Check = false; 


return $Check; 

if (DataCheck (array ("text", 324))) 
echo "Перевірка пройшла успішно <br>"; 
else echo "Дані не задовольняють умовам <br>"; 
?>

Використання змінних всередині функції

Глобальні змінні

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

global $ var1, $ var2;

Приклад 26. Глобальні змінні

<? 
$a = 1; 
function Test_g () { 
global $a; 
$a = $a * 2; 
echo 'в результаті роботи функції $ a =', $a; 

echo 'поза функції $a =', $a, ','; 
Test_g (); 
echo "<br>"; 
echo 'поза функції $a =', $a, ','; 
Test_g (); ?>

У результаті роботи цього скрипта одержимо: 
поза функції $a = 1, в результаті роботи 
функції $a = 2 
поза функції $a = 2, в результаті роботи 
функції $a = 4

Коли змінна оголошується як глобальна, фактично створюється посилання на глобальну змінну. Тому такий запис еквівалентний наступному (масив $GLOBALS містить всі змінні, глобальні щодо поточної області видимості):

$Var1 = & $GLOBALS ["var1"]; 
$Var2 = & $GLOBALS ["var2"];

Це означає що видалення змінної $var1 не видаляє глобальної змінної $GLOBALS ["var1"].

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

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

static $var1, $var2;

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

Приклад 27. Використання статичної змінної

<? 
function Test_s () { 
static $a = 1; 
// Можна присвоювати вираз або посилання 
$a = $a * 2; 
echo $a; 

Test_s (); // виведе 2 
echo $a; // нічого не виведе, так як 
// $a доступна тільки 
// Всередині функції 
Test_s (); // всередині функції $a = 2, тому 
// Результатом роботи функції 
// Буде число 4 
?>

Значення, що повертаються

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

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

<? Php 
/* Якщо другий параметр передається він сприймається 
як true, то він розглядається як 
дата смерті, */ 

function Age ($birth, $is_dead) { 
if ($is_dead) return $is_dead-$ birth; 
else return date ("Y") - $birth; 

echo Age (1971, false); // для 2009 року виведе 38 
echo Age (1971, 2001); // виведе 30 
?>

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

$An_age = Age (1981, 2004);

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

<? Php 
function Full_age ($ b_day, $ b_month, $ b_year) 

$y = date ("Y"); 
$m = intval (date ("m")); 
$d = intval (date ("d")); 
$B_month = intval($ b_month); 
$B_day = intval($ b_day); 
$B_year = intval($ b_year); 

$day = ($b_day> $d? 30 - $b_day + $d: $d - $b_day); 
$tmpMonth = ($b_day> $d? -1: 0); 
$month = ($b_month> $m + $tmpMonth? 12 - $ b_month + 
$tmpMonth + $m: $m + $tmpMonth - $b_month); 
$tmpYear = ($b_month> $m + $tmpMonth? -1: 0); 
if ($b_year> $y + $tmpYear) 

$year = 0; $month = 0;$ day = 0; 

else 

$year = $y + $tmpYear - $b_year; 

return array ($day, $month, $year); 

$Age = Full_age ("29", "06", "1986"); 
echo "Вам $age [2] років, $ age[1] місяців і $age [0] днів"; 
?>

Коли функція повертає кілька значень для їх обробки в програмі, зручно використовувати мовну конструкцію list (), яка дозволяє однією дією присвоїти значення одразу кільком змінним. Наприклад, у попередньому прикладі, залишивши без зміни функцію, обробити повернене значення можна так:

<? 
// Виклик функції Full_age () 
list ($ay, $ month, $ year) = Full_age ("07","08", "1974"); 
echo "Вам $year років, $month місяців і $day днів "; 
?>

Взагалі конструкцію list () можна використовувати для присвоєння змінним значень елементів будь-якого масиву.

Приклад 28. Використання list ()

<? 
$Arr = array ("first", "second"); 
list ($ a, $ b) = $Arr; 
// Змінній $a присвоюється перше 
// Значення масиву, $b - друге 
echo $a, "", $b; 
// Виведе рядок «first second» 
?>

Повернення посилання

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

Приклад 29. Повернення посилання

<? 
$а = 3; $ b = 2; 
function & ref ($par) { 
global $a, $b; 
if ($par% 2 == 0) return $b; 
else return $a; 

$var = & ref (4); 
echo $var, "і", $b, "<br>"; 
// Виведе 2 і 2 
$b = 10; 
echo $ var, "і", $ b, "<br>"; 
// Виведе 10 і 10 ?> 
 

При використанні синтаксису посилань на змінну $var нашого прикладу не копіюється значення змінної $b повернутої функцією $ref, а створюється посилання на цю змінну. Тобто тепер змінні $var і $b ідентичні і будуть змінюватися одночасно.

Змінні функції

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

Приклад 30. Використання змінних функцій

<? 
/* Створимо дві прості функції: 
Add_sign - додає підпис до рядка і 
Show_text - виводить рядок тексту * / 

function Add_sign ($string, 
$sign = "З повагою, Петро") { 
echo $string. "". $sign; 

function Show_text () { 
echo "Відправити повідомлення поштою <br>"; 

$Func = "Show_text"; 
// Створюємо змінну зі значенням, 
// Рівним імені функції Show_text 
$Func (); 
// Це викличе функцію Show_text 
$Func = "Add_sign"; 
// Створюємо змінну зі значенням, 
// Рівним імені функції Add_sign 
$Func ("Привіт всім <br>"); 
// Це викличе функцію 
// Add_sign з параметром "Привіт усім" 
?>

У цьому прикладі функція Show_text просто виводить рядок тексту. Здавалося навіщо для цього створювати окрему функцію, якщо існує спеціальна функція echo (). Справа в тому, що такі функції, як echo (), print (), unset (), include () і т.п. не можна використовувати в якості змінних функцій. Тобто якщо ми напишемо:

<? 
$Func = "echo"; 
$Func ("TEXT"); 
?> 
то інтерпретатор виведе помилку: 
Fatal error: Call to undefined function: 
echo () in 
c: \ users \ nina \ tasks \ func \ var_f.php on line 2

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

Символічні і жорсткі посилання

Хоча в PHP немає такого поняття, як покажчик, все ж таки існує можливість створювати посилання на інші змінні. Існує два різновиди посилань: жорсткі і символічні (змінні) (перші часто називають просто посиланнями). Жорсткі посилання з'явилися в PHP версії 4 (в третій версії існували лише символічні посилання).

Посилання в PHP - це засіб доступу до вмісту однієї змінної під різними іменами. Вони не схожі на покажчики мови Сі і не є псевдонімами таблиці символів. У PHP ім'я змінної і її вміст - це різні речі, тому один вміст може мати різні імена. Найближча аналогія - імена файлів Unix і медіа - імена змінних є елементами каталогів, а вміст змінних це самі файли. Посилання в PHP - аналог жорстких посилань (hardlinks) у файлових системах Unix.

Жорсткі посилання в PHP

Жорстке посилання представляє собою просто змінну, яка є синонімом іншої змінної. Багаторівневі посилання (тобто, посилання на посилання змінної, як це можна робити, наприклад, у Perl) не підтримуються. Так що не варто сприймати жорсткі посилання серйозніше, ніж синоніми.

Щоб створити жорстке посилання, потрібно використовувати оператор & (амперсанд). Наприклад:

$a = 10; 
$b = & $a; // тепер $b - те ж саме, що і $a 
$b = 0; // насправді $a = 0 
echo "b = $b, a = $a"; / / Виводить: "b = 0, a = 0"

Посилатися можна не тільки на змінні, але й на елементи масиву (цим жорсткі посилання вигідно відрізняються від символічних). Наприклад:

$a = array ('a' => 'aaa', 'b' => 'bbb'); 
$b = & $a ['b']; // тепер $b - те ж, що й елемент з індексом 'b' масиву 
$b = 0; / / насправді $a ['b'] = 0; 
echo $a ['b']; // Виводить 0

Втім, елемент масиву, для якого планується створити символічне посилання, може і не існувати. Як у наступному випадку:

$a = array ('a' => 'aaa', 'b' => 'bbb'); 
$b = & $a ['c']; // тепер $b - те ж, що й елемент з індексом 'c' масиву 
echo "Елемент з індексом 'c': (". $a ['c'].")";

В результаті виконання розглянутого скрипта, хоча посиланням $b і не було нічого присвоєно, в масиві $a створиться новий елемент з ключем c і значенням - порожній рядком (ми можемо це визначити за результатом роботи echo). Тобто, жорстке посилання на самому ділі не може посилатися на неіснуючий об'єкт, а якщо робиться така спроба, то об'єкт створюється.

Примітка: Якщо прибрати рядок, в якій створюється жорстке посилання, то буде виведено повідомлення про те, що елемент з ключем c не визначено в масиві $а.

Жорсткі посилання зручно застосовувати при передачі параметрів для функції користувача і повернення значення з неї.

Символічні посилання (змінні на змінні)

Символічне посилання - це всього лише рядкова змінна, що зберігає ім'я іншої змінної. Щоб дістатися до значення змінної, на яку посилається символічне посилання, необхідно застосувати додатковий знак $ перед ім'ям посилання. Розглянемо приклад:

$A = 10; 
$B = 20; 
$C = 30; 
$P = "А"; / / або $Р = "В" або $Р = "С" (присвоюємо $p ім'я іншої змінної) 
echo $$Р; // виводить змінну, на яку посилається $Р, тобто $А 
$$P = 100; / / присвоює $А значення 100

Ми бачимо, що для того, щоб використовувати звичайну рядкову змінну як посилання, потрібно перед нею поставити ще один символ $. Це говорить інтерпретатору, що треба взяти не значення самої $Р, а значення змінної, ім'я якої зберігається у змінній $Р.

Символічні посилання (змінні на змінні) використовуються досить рідко.

 

Жорсткі посилання і призначені для функцій користувача

 

Передача значень за посиланням

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

<? Php 
function foo (& $var) 

$var + +; 


$a = 5; 
foo ($a); 
// $a тут дорівнює 6 
?>

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

Ще один цікавий приклад:

<? Php 
function funct (& $string) 

$string .= 'а ця всередині.'; 

$str = 'Цей рядок за межами функції,'; 
funct ($str); 
echo $ str; // Виведе 'Цей рядок за межами функції, а ця всередині.' 
?>

За посиланням можна передавати:

  • Змінні, наприклад foo ($ a)
  • Оператор new, наприклад foo (new foobar ())
  • Лінки, які повертаються функцією, наприклад:

<? Php 
function & bar () 

$a = 5; 
return $a; 

foo (bar ()); 
?>

Будь-яке інше вираження не повинно передаватися по посиланню, так як результат не визначений. Наприклад, наступна передача за посиланням є неправильною:

<? Php 
function bar () // Операція & відсутня 

$a = 5; 
return $a; 

foo (bar ()); 

foo ($a = 5); // Вираз, а не змінна 
foo (5); // Константа, а не змінна 
?>

Повернення значень за посиланням

Розглянемо ще одну можливість функцій користувача PHP - повернення посилань.

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

<? Php 
function & find_var ($param) 

/ * ... код ... * / 
return $found_var; 


$foo = & find_var ($ bar); 
$foo-> x = 2; 
?>

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

Ще один приклад повернення значень користувача функції за посиланням:

<? Php 
$a= 100; 
/* Далі йде функція, яка повертає посилання */ 
function & s () { 
global $a; 
// Повертаємо посилання на змінну $a 
return $a; 

// Надаємо посилання змінної $b 
$b = & s (); 
$b = 0; 
echo $a; // Виводить 0 
?>

Видалення посилань (скидання посилань)

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

<? Php 
$a = 1; 
$b = & $a; 
unset ($a); 
?>

Цей код не скине $b, а тільки $a.

І все ж, жорстке посилання - не абсолютно точний синонім об'єкта, на який він посилається. Справа в тому, що оператор Unset (), виконаний для жорсткого посилання, не видаляє об'єкт, на який він посилається, а всього лише розриває зв'язок між посиланням і об'єктом.

Отже, жорстке посилання і змінна (об'єкт), на яку він посилається, абсолютно рівноправні, але зміна однієї тягне зміну іншої. Оператор Unset () розриває зв'язок між об'єктом і посиланням, але об'єкт видаляеться тільки тоді, коли на нього ніхто вже не посилається.