Змінні і функції - html, css, javascript, perl, php, mysql

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

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

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

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

function FunctionName (SArgument) global $ Variable;
statement (s);

Розглянемо докладніше, що ж дає нам інструкція глобалізації. Зви ва змінна, навіть якщо її ім'я всередині функції повністю збігається з та ким же ім'ям в основній частині програми, являє собою абсолютно іншу структуру (можливо, з іншим значенням, ніж змінна поза функ ції). Нехай рядок виклику функції виглядає як FunctionName ($ Valuel). а функція визначена як FunctionName ($ Argumentl). У момент звернення до функції РНР встановлює значення $ Argumentl рівним значенню $ Valuel, і далі Перший використовується в тілі функції. Якщо ви зміните значення $ Argumentl всередині функції, це ніяк не відіб'ється на значенні $ Valuel. Якби імена змінних випадково збіглися, це б нічого не змінило: вони все одно є двома різними змінними. Область дії однієї ре дині функції, інший поза функцією. Тому, щоб уникнути плутанини, при написанні функцій ми завбачливо використали різні імена пе ремінних в рядку визначення функції і в рядку її виклику.

Ми торкнулися цієї теми, тому що насправді необов'язково застосовувати різні імена. Для зручності можна використовувати одне і те ж ім'я в рядку функції і в рядку виклику (тоді легко запам'ятати передані аргументи), але пам'ятайте, що це різні змінні. Те, що відбувається зі значенням змінної всередині функції, залишається в функції. І навпаки: зміни пе пасової поза функції не діють на змінну з тим же ім'ям всередині функції. Але, якщо ви зробили змінну глобальної за допомогою інструкції global, вона стає однією і тією ж змінної і всередині, і зовні. Використання інструкції global

Змінні $ Price і $ TaxRate будуть введені в функцію як $ Cost і $ Тах за допомогою інструкції global, тому немає необхідності використовувати їх як аргументи.

  • Додайте дві глобальні інструкції. global $ Cost;
    global $ Tax;

    Вони «Накажуть» функції використовувати змінні $ Cost і $ Тах, які вже існують поза нею.

  • Відредагуйте решту функції, замінивши змінну $ Price на $ Cost, $ TaxRate на $ Тах, a $ TheCost на $ TotalCost. $ Тах ++; // $ Тах становить 1.06. *
    $ TotalCost

    ($ Cost * $ HowMany);
    if (($ TotalCost <50) AND ($Savings) ) print ("Your $$Savings will not apply because
    -the total value of the sale is under! \ n

    ");
    > If ($ TotalCost> = 50) $ TotalCost = $ TotalCost $ Savings;
    >.
    $ TotalCost = $ TotalCost * $ Tax;
    return $ TotalCost;

    Так як тепер функцією використовуються різні імена змінних, не обхідно відповідним чином змінити обчислення. Щоб краще зрозуміти область дії змінної, ми поміняли також змінну $ TheCost на $ TotalCost. Запам'ятайте, що $ TotalCost в функції це зовсім не та змін ная, як змінна з тим же ім'ям, але що знаходиться поза функцією

  • Нижче в сценарії, після рядка $ Тах = 0.06; (Рядок 29), роздрукуйте поточне значення змінної. Воно буде змінюватися в ході подальшого виконання сценарію. print ( "The tax value is currently $$ Tax. \ n

    ");

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

  • Змініть рядок виклику функції CalculateTotal (). щоб змінні $ Тах і $ Cost більше не передавалися як аргументи.
    $ TotalCost = CalculateTotal ($ Quantity, $ Discount);

    Так як функція приймає тепер тільки два аргументи, передача чотирьох аргументів викличе помилку.

  • Ще раз роздрукуйте значення змінної $ Тах. print ( "After calling the function, the tax value
    is now $$ Tax. \ n

    ");

    Якби не було інструкції global, то значення, роздруковані тут і вище, були б однаковими. Але, оскільки глобальна змінна $ Тах були внесені зміни в функції, роздруковані значення будуть різними.

    Лістинг 9.7 т Так як функції CalculateTotal потрібні значення пере сних $ Cost і $ Тах, вони легко можуть бути включені за допомогою інструкції global. Пам'ятайте, змінні більше не можна передавати як аргументи це може заплутати програміста і викликати певні помилки в роботі при розкладання.

    Завдання значень аргументів за замовчуванням

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

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

    function CalculatePayments ($ Amount, $ NumberPayments = "12")

    Виклик функції за допомогою коду CalculatePayments ($ Amounts); не щеплена дет до жодних проблем, а рядок CalculatePayments ($ Amounts, "2. 4"); за менитой значення змінної $ NumberPayments зі значення за замовчуванням, рав ного 12, на фактичне, рівне 24.

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

    function CalculateTotal ($ HowMany, $ Price = "20.00", $ TaxRate = "0.06")

    Ми викличемо її такою рядком:

    CalculateTotal (3, "0.07");

    При цьому ми збираємося поставити аргументу $ HowMany значення 3, бажаючи осту вити показник $ Price рівним 20.00 і сподіваючись змінити величину $ TaxRate на 0.07. На жаль, у нас нічого не вийде. Змінна $ HowMany дійсно по одержить значення 3, $ Price 0.07, a $ TaxRate залишиться рівним 0.06. Пам'ятається, ми хотіли отримати дещо інший результат. Домогтися потрібного результату можна наступним чином:

    CalculateTotal (3, "20.00", "0.07");

    Тепер в світлі того, що ми дізналися про завдання значень аргументів стандартно чанію, змінимо сторінку numbers.php (лістинг 9.7).

    Написання функції, яка використовує значення за замовчуванням

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

  • Зітріть два рядки в основному тілі сценарію * які роздруковують значення $ Тах. Вони більше не потрібні.
  • Змініть виклик функції CalculatePayments () так, щоб аргументи для кількості платежів більше не посилалися. print (CalculatePayments ($ TotalCost));

    Виклик функції CalculatePayments Про передає тепер тільки значення $ TotalCost як аргумент, так як $ NumberPayments має значення за замовчуванням. Тут можна було б передати і значення $ NumberPayments, якби ви виріши чи використовувати іншу кількість, щомісячних платежів.

    Лістинг 9.8 т Оновлена ​​сторінка numbers.php. Завдання значення за замовчуванням в функції робить аргумент опціональним.

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

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