ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 24.05.2024

Просмотров: 144

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

?>

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

Результатом роботи цього скрипта буде:

Наступні збори відбудуться завтра. Оргкомітет.

Наступні збори відбудуться завтра. З повагою, Вася.

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

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

<?php

function Add_article($title, $description, $author="Іванов Іван"){ echo "Заносимо в каталог статтю: $title,";

echo "автор $author";

echo "<br>Короткий опис: "; echo "$description <br>";

}

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

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

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

func_num_args(), func_get_arg(), func_get_args().

71

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

<?php

function DataCheck(){ $n = func_num_args();

echo "Число аргументів функції $n";

}

DataCheck();

//виведе рядок "Число аргументів функції 0"

DataCheck(1,2,3);

//виведе рядок "Число аргументів функції 3"

?>

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

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

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

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

<?

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>"; ?>

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

Результатом роботи буде наступне.

Перевірка пройшла успішно Перевірка пройшла успішно

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

72


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

<?

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("text", 324))

echo "Перевірка пройшла успішно<br>";

else echo "Дані не задовольняють умовам<br>";

?>

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

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

global $var1, $var2; <?

$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(); ?>

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

У результаті роботи цього скрипта одержимо:

поза функцією $a=1, у результаті роботи функції $a=2 поза функцією $a=2, у результаті роботи функції $a=4

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

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

static $var1, $var2;

73

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

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

Всі функції, наведені вище як приклади, виконували які-небудь дії. Крім подібних дій, будь-яка функція може повертати як результат своєї роботи яке-небудь значення. Це робиться за допомогою оператора 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

?>

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

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

<?

$arr = array("first","second"); list($a,$b) = $arr;

//змінній $a привласнюється перше значення масиву, $b - друге echo $a," ",$b;

//виведе рядок "first second"

?>

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

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

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

<?

$a = 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>";

74


// виведе 10 й 10

?>

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

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

7 Внутрішні (убудовані) функції

Говорячи про функції, створені користувачем, все-таки не можна не сказати пари слів про вбудовані функції. З деякими з вбудованих функцій, такими як echo(), print(), date(), include(), ми вже познайомилися. Насправді всі перераховані функції, крім date(), є язиковими конструкціями. Вони входять у ядро PHP і не вимагають ніяких додаткових налаштувань і модулів. Функція date() теж входить до складу ядра PHP і не вимагає настроювань. Але є й функції, для роботи з якими потрібно встановити різні бібліотеки й підключити відповідний модуль. Наприклад, для використання функцій роботи з базою даних MySql варто скомпілювати PHP з підтримкою цього розширення. Останнім часом найпоширеніші розширення й відповідно їхній функції споконвічно включають до складу PHP так, щоб з ними можна працювати без яких би те не було додаткових настроювань інтерпретатора.

Рішення завдання

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

Розіб'ємо завдання на кілька підзадач: вибір типів елементів введення і їхньої кількості, створення назв елементів введення й обробка отриманих даних, тобто безпосередньо генерація форми. Перше завдання досить просте: потрібно написати відповідну форму, наприклад подібну наведеної нижче (task_form.html):

<form action="ask_names.php">

Створити елемент "рядок уведення тексту":

<input type=checkbox name=types[] value=string><br>

Кількість елементів:

<input type=text name=numbers[string] size=3><br> <br>

Створити елемент "текстова область":

<input type=checkbox name=types[] value=text><br>

Кількість елементів:

<input type=text name=numbers[text] size=3><br>

<input type=submit value="Створити">

</form>

Листинг 5.12. task_form.html

Коли ми пишемо в імені елемента форми, наприклад types[], це значить, що його ім'я - наступний елемент масиву types. Тобто в нас перший елемент форми ( "рядок уведення тексту" ) буде мати ім'я types[0], а другий (текстова область) - types[1]. У браузері task_form.html буде виглядати приблизно так:

75


Рис. 5.1. Форма для вибору створюваних елементів й їхньої кількості

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

<?

$file = "task.php";

/* файл, що буде обробляти сгенерировану цим скриптом форму */ function Ask_names(){

// функція генерує форму для уведення назв елементів уведення global $file;

//повідомляємо, що хочемо використати цю змінну, задану поза функцією if (isset($_GET["types"])){

$st = '<form action="'.$file.'">'; foreach ($_GET["types"] as $k => $type){

/* перебираємо всі типи елементів, які потрібно створити */ $num = $_GET["numbers"][$type];

//скільки елементів кожного типу потрібно for ($i=1;$i<=$num;$i++){

//створюємо $num рядків для уведення

$st.= "Уведіть ім'я $i-го елемента типу $type: "; $st.= "<input type=text name=names[$type][]><br>";

}

//зберігаємо тип і число необхідних

//елементів уведення цього типу

$st.= "<input type=hidden name=types[] value=$type>"; $st.= "<input type=hidden name=numbers[] value=$num><br>";

}

$st .= "<input type=submit name=send value=send></form>"; return $st;

//у змінної $st утримується код форми для запиту імен

}else echo "Select type";

}

echo Ask_names();

//викликаємо функцію й виводимо

//результати її роботи

?>

Листинг 5.13. ask_names.php

76

6. Лекція:

Тема: Об’єкти й класи в PHP:.

Мета: дати визначення понять ООП в РНР - Поняття розширення класу. Конструктори. Оператор :: Базовий класоа і функція parent. Приклад - автоматична генерація за бажанням користувача представників класів статей або особистостей, а також їхнього відображення на сторінці браузера.

1.Що таке, у вашому розумінні, функція? Для чого потрібні функції?

2.Що таке параметри функції? В чому їх призначення?

3.Скільки параметрів може мати функція?

4.Як викликати функцію?

5.Як можна передати дані до функції?

6.Чи завжди кількість аргументів функції однакова?

7.Яким чином можна визначити кількість та тип аргументів функції?

8.Що таке Статичні змінні? В чому їх призначення?

9.Як повертаються результати роботи функції?

10.Перерахуйте відомі вам вбудовані функції.

ПЛАН

1Класи й об’єкти

2Ініціалізація змінних

3Об’єкти

4Спадкування extends

5Оператор ::

6Оператор parent

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

1 Класи й об’єкти

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

В PHP клас визначається за допомогою наступного синтаксису:

class Ім’я_класу{

var $ім’я_властивості; /*список властивостей*/ function ім’я_методу( ){ /* визначення методу */ } /*список методів*/

}

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

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

<?

class Articles { // Створюємо клас Статей

77


var $title; var $author;

var $description;

// метод, що привласнює значення атрибутам класу function make_article($t, $a, $d){

$this->title = $t; $this->author = $a; $this->description = $d;

}

//метод для відображення екземплярів класу function show_article(){

$art = $this->title . "<br>" . $this->description .

"<br>Автор: " . $this->author; echo $art;

}

}

?>

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

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

Кілька зауважень із приводу імен класів. Ім’я класу повинне задовольняти правилам іменування об’єктів у мові PHP, але є ряд імен, які зарезервовані розробниками для своїх цілей. У першу чергу це імена, що починаються із символу підкреслення "_". Для створення класів і функцій не можна використати такі імена. Крім того, зарезервоване ім’я stdClass, оскільки воно використається усередині движка PHP.

2 Ініціалізація змінних

Часто деяким атрибутам класу буває необхідно привласнювати значення відразу після створення представника класу. Коли ми створювали клас статей, для присвоювання значень атрибутам ( властивостям ) класу ми використали спеціальну функцію make_article(). Загалом кажучи, ми вчинили не зовсім вірно, тому що зайнялися винаходом велосипеда. Спеціально для завдання початкових значень атрибутам класу існує два стандартних методи. В PHP4 можна ініціалізувати значення за допомогою оператора var або за допомогою функції конструктора. За допомогою var можна ініціалізувати тільки константні значення. Для завдання не константних значень використовують функцію конструктор, що викликається автоматично, коли об’єкт конструюється із класу. Функція-конструктор повинна мати ім’я, що збігається з ім’ям усього класу, у якому вона визначена.

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

<?

class Articles { // Створюємо клас Статей var $title;

var $author = "Іванов"; var $description;

78