16295

Функції в РНР

Лабораторная работа

Информатика, кибернетика и программирование

Лабораторна работа №3 Функції Мета роботи: ознайомитися з синтаксисом опису функцій РНР. Теоретичні відомості По синтаксису опис функцій РНР досить близький до ідеальної концепції... Ось декілька основних достоїнств цієї концепції: ви можете використов...

Украинкский

2013-06-20

91 KB

4 чел.

Лабораторна  работа №3

Функції

Мета роботи: ознайомитися з синтаксисом опису функцій РНР.

Теоретичні відомості

    По синтаксису опис функцій РНР, досить близький до ідеальної концепції... Ось декілька основних достоїнств цієї концепції:

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

   На жаль, розробники РНР не передбачили можливість створення локальних функцій (тобто одній усередині іншої), як це зроблено, скажімо, в Паскалі або в Visual C++. Проте деяка емуляція локальних функцій все ж таки є: якщо функцію В визначити в тілі функції А , то вона, хоч і не ставши локальною, все ж таки буде "видима" для програми, нижче свого визначення. Відмічу для порівняння, що схожа схема існує і в мові Perl.

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

Приклад функції

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

Лістинг.

function GetMax($arr, $max=1'"'){ //проходмося по всіх елементах масиву for($i=0,$n=-l; $<count($arr);

// якщо цей елемент нам поки підходить, запамятовуемо його if((!isset($m)|| $arr[$i]>$m) && ($max=-=='" || $arr[$i]<$max))

!

// сюди ми потрапляємо, коли черговий елемент більший поточного, або ж поточного елементу ще не існує (перший прохід)

$m=$arr[$i]; // запам'ятовуємо поточний? елемент $n=$i; // запам'ятовуємо його номер

return $n;

}

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

echo "Програма.

function GetMax($arr, $max="")

{

тіло функції

}

echo "Програма продовжується!';

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

Алгоритм роботи функції такий: у циклі аналізуємо черговий елемент на предмет "максимальності": якщо він більше поточного максимального елементу, але менше $mах, він сам стає поточним максимумом, а його положення запам'ятовується в $n. (Звернете увагу, що в описі функції параметр $mах здається у вигляді $mах=". Це означає, що якщо при виклику він буде опущений, то функція одержить порожній рядок в $mах.) Після закінчення циклу в $n опиниться номер такого елементу (або число -1. яке ми привласнили $n на початку). Його-то ми і повертаємо як значення функції оператором return.

    Ну ось, тепер в програмі нижче за опис функції можна написати:

$а=аггау ( 10, 20, 80, 35, 22, 57 )

$m= GetMax ($а,50); // тепер $т=3, тобто $a[$m]=35

    Навіщо може знадобитися функція GetMax (I в реальному житті? Наприклад, для сортування масиву в порядку убування з одночасним отриманням унікальних елементів. Звичайно, це буде дуже неоптимальний алгоритм, але для тренувальних цілей він нам цілком підійде

Лістинг. Сортування із застосуванням GetMax () function MySort($Arr)

{

$m- GetMax($Arr)+l; // число, на 1 більше максимуму в масиві

while (($n=GetMax($Arr, $m)!=-l)

$New[]=$m=$Arr[$n]) // додаємо  черговий максимальний елемент return $New;

}

// Приклад виклику:

$Sorted=My3or ( array (1, 2, 5, 2. 4, 7, 3, 7. 8));

/// Тепер $ Sorted - array(8.7.5,4,3.2,l)

  Приведена функція не змінює початковий масив, а повертає новий. Через пристрій функції GetMaxQ в результуючому  масиві будуть поміщені тільки унікальні елементи з $Arr. Відсортовані в порядку убування.

Загальний синтаксис визначення функції

    У загальному вигляді синтаксис визначення функції т ikob:

function ім'я функції(арг! [=зн1], арг2 [=зн2] ... aprN [=знМ])

{

оператори тіла функції;

}

    Ім'я функції повинне бути унікальним з точністю до регістра букв. Це означає, що, по-перше, імена MyFunction, myfunction і навіть MyFunCtioN вважатимуться однаковими, і, по-друге, ми не можемо перевизначити певну функцію (стандартну чи ні - не важливо), але ми можемо давати функціям такі ж імена, як і змінним в програмі (звичайно, без знаку $ на початку). Список аргументів, який легко побачити, складається з декількох перерахованих через кому змінних, кожну з яких ми повинні будемо задати при виклику функції (втім, коли для цієї змінної привласнено через знак рівності значення за умовчанням (позначене =знМ), її можна буде опустити; див. про це трохи нижче). Звичайно, якщо у функції не повинно бути аргументів зовсім (як це зроблено у функції timeQ ), то слід залишити порожні дужки після її імені, наприклад:

Function SimpleFunction()

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

     Інструкція return

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

function MySqrt($n)

{

return $n*$n;

}

echo $mySqrt(4); // виводить 16

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

Лістинг 11.3. Повернення масиву

Function SILLYQ

return array(l,2,3);

}

// привласнює масиву значення array( 1,2,3)

$arr=Silly();

// привласнює змінним $а, $b, $c перші значення із списку

list($a,$b,$c)=Silly();

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

    Параметри за умовчанням

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

Funtction MySort($Arr, $NeddLoOrder=l)

{

... сортуємо залежно від $Меес11юОгс1ег .

    Тепер, маючи таку функцію, можна написати в програмі:

MySort ($my_array,0); // сортує в порядку зростання

MySort ($my_array); // другий аргумент задається за умовчанням!

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

// Помилка!

Funtction MySort($NeddLoOrder=l, $Arr)

сортуємо залежно від $NeddLoOrder...

MySort (,$my_array); // Помилка! Це вам не Бейсік!

    Передача параметрів по посиланню

    Давайте розглянемо механізм, за допомогою   якого для функції передаються її аргументи. Нехай, наприклад, у нас є така программа : Function Test($a)

{

echo "$a\n"; $a++; echo "$a\n";

}

$num=10; Test ($num); echo $num;

    Що відбувається перед початком роботи функції Test () (яка, до речі, не повертає ніякого значення, тобто є в чистому виді підпрограмою або процедурою) - як виражаються програмісти на Паскалі? Все починається з того, що створюється змінна $а, локальна для даної функції (про локальні змінні ми поговоримо пізніше), і їй привласнюється значення 10 (те, що було в $num). Після цього значення 10 виводиться на екран, величина $а інкрементується  і нове значення (11) знову друкується. Оскільки тіло функції закінчилося, відбувається повернення в програму, що викликана. А зараз питання: що буде надруковане при подальшому виведенні змінної $гнпв? А надруковане буде 10 (і це не дивлячись на те, що в змінній $а до повернення з функції було 11!) Ясно, чому це відбувається: адже $а - лише копія $num, а зміна копії, звичайно, ніяк не відбивається на оригіналі.

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

Лістинг. 4. Передача параметрів по посиланню (новый спосіб)

Function Test($a)

{

echo "$a\n"; $a++; echo "$a\n";

}

$num=10;

Test (&$num); // а зараз $num=l 1!

echo $num; //выводит 11!

    Такий спосіб передачі параметрів історично називається "Передачею по посиланню', в цьому випадку аргумент не є копією змінної, а "ссилается"' на неї. У другому розділі ми вже мали справу з посиланнями. Ви можете відмітити, що передача параметра по посиланню повністю відповідає синтаксису завдання посилальній змінній в РНР.

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

Листинг.5. Передача параметрів по посиланню (другий спосіб)

Function Test (&$a)

{

echo "$a\n";

$а++; echo "$a\n";

}

$num=10;

Test ($num); // а зараз $num=l 1!

echo $num; //выводит 11!

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

    Змінне число параметрів

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

Лістинг, . Змінне число параметрів функції Function MYECHOQ

{

for($i=0; $func_num_args(); $i++)

{

for($j=0; $j<$i; $j++) echo "&nbsp;"; // виводимо відступ

echo func_get_arg ($i) ."<br>\n"; // виводимо елемент

// відображаємо рядки "драбинкою"

Myecho ("Меркурій", "Венера", 'Земля", "Марс');

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

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

•int func_num_args()

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

•mixed func_get_arg(int $num)

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

•list func_get_args()

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

                                                      Рекурсія

    Звичайно, в РНР підтримуються рекурсивні виклики функцій, тобто виклики функцією самої себе (зрозуміло, не до безкінечності, а у відповідності з певною умовою). Це буває надзвичайно зручно для таких завдань, як, наприклад, обхід всього дерева каталогів вашого сервера (з метою підрахувати сумарний об'єм, який займають всі файли), або для інших завдань. Розглянемо для прикладу функцію, яка рекурсивно обчислює факторіал з деякого числа п (позначаєте п ). Алгоритм стандартний: якщо п=0, то п! =1, а інакше п! =п *( (п-1) !). function Factor($n)

{

If($n<=0) return 1;

Else return $n*Factor($n-l);

}

Echo Factor(20);

                                               Варіанти завдання

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

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

   3.У системі Фібоначе числа вираховуються за правилами:

Використовуються тільки символи 0 і 1;

Кожен    розряд відповідає елементу    послідовності
Фібоначчі 1, 2, 3, 5, 8 ..., тобто вказує на наявність або
відсутність такого;

У сусідніх розрядах не можуть стояти символи 1. оскільки це
автоматично означає формування наступного за ними розряду.
Наприклад, 1710 = 1310 + 310 ч 110= 100101ф.

Складіть програму перекладу числа з десяткової системи у систему Фібоначче. Вважати вхідні дані введеними коректно.

   4.Вирішите задачу про Ханойські башти, вказавши алгоритм переміщення дисків. Число дисків задайте в програмі. Наприклад, для 2 дисків повинен видаватися результат: а->1>, а->с, Ь->с.

   5. Для даного натурального числа від 2 до 20 роздрукуйте усі його
різноманітні розбиття на суму натуральних доданків. Наприклад, для
числа 3 повинен видаватися результат: 1+1+1, 1+2, 3.

    6. Латинським квадратом порядку п називається матриця розміром n x п, в
якій натуральні числа від 1 до п розставлені так, що ні в одному
рядку  і  ні  в  одному
 стовпці;  немає  повторень.  Для  даного  п
роздрукуйте хоч би один латинський квадрат.

   7. Вирішите узагальнену задачу Іоси })а Флавія. Натуральні числа від 1до N записані по порядку і розміщені по кругу.  Починаючи з 1,
викреслюється кожне n-е
 число (п>1).  Процес видалення чисел
продовжується циклічно по кругу до тих пір, поки не залишиться (п-1)
число. Знайти ці числа.

  8. Виконавець вміє виконувати дві дії: «+1», «*2». Складіть
програму отримання з числа 1 ч
ісла 100.

  9. Сформуйте       рядкову       величину       по       закономірності:
«
аабабвабвгабвгд...».    Закінчення    послідовності    визначає
введений з клавіатури символ - мала буква  українського алфавіту.

  10. Розкладіть дане натуральне число N на прості множники.

Контрольні питання:

Що називається підпрограмою?

Які переваги використання  підпрограм.

Що таке локальні і глобальні змінні?

У чому полягає відмінність процедур і функцій в РНР?

Яким чином проводиться виклик  функції в програмі?

Що таке рекурсія?

Навести приклад рекурсивних об'єктів.

Коли рекурсивні алгоритми є малофективними?


 

А также другие работы, которые могут Вас заинтересовать

56491. Бінарний урок за темою «Подорож» (англійська та німецька мови) 536 KB
  Our lesson is not a traditional one. First of all I should mention that it is the binary English and German lesson. Our lesson will have the form of a test travel-seminar. At our lesson we shall revise some facts we know about Great Britain and Germany, we shall travel around these countries in 45 minutes.
56492. Travelling to the Land of Health. Подорож в країну Здоров’я 36 KB
  Good morning, children! Today we are going to speak about health. Look at the proverb “Health is above Wealth”. How do you understand these words? Healthy people are happy and rich. Health is above wealth because when we are ill, we do not want to study, to work and to play.
56493. Подорож до країни, мову якої вивчаємо. Прикметник. Ступені порівняння прикметника 102 KB
  Travelling is remarkable in all seasons: in summer when the trees are green and there are a lot of flowers everywhere, in autumn when the trees are coloured, in winter when everything is white with snow, in spring when the trees are in blossom.
56494. Travelling 56 KB
  The most expensive and the fastest way of travelling is by plane. With modern air liner you can travel in one hour to a place you want. The seats are comfortable there. You can sit and read, look out of the window or sleep until you arrive at your airport.
56495. ЗАГАЛЬНА ХАРАКТЕРИСТИКА ОРГАНІВ ТРАВЛЕННЯ. ФІЗІОЛОГІЧНА СУТНІСТЬ ТРАВЛЕННЯ 98 KB
  МЕТА: встановити біологічне значення травлення зробивши загальний огляд травної системи; переконатися в відповідності її функцій; уточнити поняття харчові продукти і поживні речовини...
56496. ТРАВМАТИЗМ НА УРОКАХ ФІЗКУЛЬТУРИ 134 KB
  Травматизм на заняттях фізичної культури - явище, не сумісне з оздоровчими цілями фізичної культури й спорту. Згідно із чинним законодавством, школа несе відповідальність за життя і здоровя учнів.
56498. Требования к конспекту урока математики студента-практиканта в специальном (коррекционном) образовательном учреждении VIII вида 32 KB
  Требования к конспекту урока математики студентапрактиканта в специальном коррекционном образовательном учреждении VIII вида В конспекте указываются: школа класс математика как учебный предмет и дата проведения урока. Рассматривается раздел программы и тема урока в соответствии с разделом программы. Студент должен четко мысленно воспроизводить место урока по данному разделу. Раскрываются цели урока: образовательная воспитательная и коррекционноразвивающая.
56499. Требования к написанию урока по информатике 360 KB
  Образовательные - изучение типов таблиц, определение назначения таблиц различного типа, формирование умений по построению таблиц. Развивающие - формирование приемов мыслительной деятельности и гибкости мышления при ответах на вопросы учителя, развитие умения слушать в процессе объяснения нового материала.