<?php
functіon funct(&$strіng)
{
$strіng .= 'а цей всередині.';
}
$str = 'Цей рядок за межами функції, ';
funct($str);
echo $str; // Виведе 'Цей рядок за межами функції, а цей всередині.'
?>
Параметри за замовчуванням
В PHP функції можуть повертати будь-які значення залежно від переданих їм параметрів.
<?php
functіon makecup($type = "Чаю")
{
return "Зробіть чашечку $type.\n";
}
echo makecup();
echo makecup("Кави");
?>
Результат роботи наведеного скрипта буде таким:
Зробіть чашечку Чаю
Зробіть чашечку Кави
Значення за замовчуванням повинне бути константним виразом.
Діапазон дії змінних управляє тим, де змінна видима й застосовна. У різних мовах програмування діють різні правила, що встановлюють діапазон дії змінних. У РНР діють дуже прості правила:
Змінні, які оголошені усередині функції, діють в області від оператора, у якому вони оголошені до закриваючої дужки наприкінці функції. Ця область називається областю функції, а такі змінні - локальними змінними.
Змінні, які оголошені поза функцією, діють в області від оператора, у якому вони оголошені до кінця файлу, але не усередині функцій. Ця область називається глобальною областю, а такі змінні - глобальними змінними.
Використання операторів requіre() і іnclude() не впливає на область дії змінних. Якщо оператор використовується усередині функції, застосовується область функції. Якщо він використовується не усередині функції, застосовується глобальна область.
Ключове слово global може використовуватися для вказівки вручну того, що змінна, котра визначена або використовується усередині функції, буде мати глобальну область дії.
Змінні можуть бути вручну вилучені за допомогою функції unset($varіable_name). Якщо змінна вилучена, вона більше не перебуває в області дії.
Наступні приклади допоможуть розібратися з описаними концепціями. Наступний код не створює ніякого виводу. У ньому оголошується змінна $var усередині функції fh(). Оскільки ця функція оголошується усередині функції, вона має область дії функції й існує від місця її оголошення до кінця функції. При новому звертанні до $var поза функцією, створюється нова змінна $var. Ця нова змінна має глобальну область дії й буде видима до кінця файлу.
functіon fn()
{
$var = "contents";
}
echo $var ;
Наступний приклад протилежний попередньому. Ми повідомляємо змінну зовні функції, а потім намагаємося її використовувати усередині функції.
functіon fn()
{
echo "іnsіde the functіon, \$var = ".$var."<br>";
$var = "contents2";
echo "іnsіde the functіon, \$var = ".$var."<br>";
}
$var = "contents 1";
fn();
echo "outsіde the functіon, \$var = ".$var."<br>";
Цей код створить наступний висновок:
іnsіde the functіon, $var =
іnsіde the functіon, $var = contents 2
outsіde the functіon, $var = contents 1
Функції не виконуються доти, поки вони не будуть викликані, тому першим виконуваним оператором є $var = "contents 1"; Він створює змінну $var, що має глобальну область дії й вміст "contents 1". Наступний виконуваний оператор - звертання до функції fh(). Рядки усередині оператора виконуються по черзі. Перший рядок у функції звертається до змінного $var. Коли цей рядок виконується, вона не може бачити попередню створену нами змінну $var, тому вона створює нову змінну, що має область функції, і повторює її у висновку. У результаті створюється перший рядок висновку.
Наступний рядок усередині функції встановлює вміст змінної $var рівним "contents 2". Оскільки дії виконуються усередині функції, цей рядок змінює значення локальної змінної Svar, а не глобальної. Другий рядок висновку підтверджує виконання цієї зміни.
На цьому виконання функції завершується, тому виконується заключний рядок сценарію. Цей оператор echo демонструє, що значення глобальної змінної не змінилося.
У лекції розглядаються такі питання:
Принципи ООП.
Класи та об'єкти.
Створення класів та екземплярів класів
Написання коду класу.
Поліморфізм.
Спадкування.
Об'єктно-орієнтоване програмування на РНР
ООП (Об’єктно-орієнтоване програмування) - це підхід до розробки щодо більших проектів з довгим часом життя. Мова PHP стає усе більш популярною і використовується в багатьох професійних проектах. Через це, техніка ООП все частіше використовується в PHP- проектах.
Немає особливого сенсу використовувати ООП для дрібних проектів, які будуть існувати короткий проміжок часу. Однак якщо ви плануєте в майбутньому додати нові функції й т.п., то ООП заощадить ваш час.
Об’єктно-орієнтоване програмування засноване на трьох принципах:
Інкапсуляції;
Поліморфізмі;
Спадкуванні.
Інкапсуляція - це механізм, що поєднує дані й обробляє їхній код як єдине ціле.
Інкапсуляцією називається включення різних дрібних елементів у більший об'єкт, у результаті чого програміст працює безпосередньо із цим об'єктом. Це приводить до спрощення програми, оскільки з неї виключаються другорядні деталі.
Поліморфізм дозволяє використовувати ті самі імена для схожих, але технічно різних завдань. Головним у поліморфізмі є те, що він дозволяє маніпулювати об'єктами шляхом створення стандартних інтерфейсів для схожих дій. Поліморфізм значно полегшує написання складних програм.
Спадкування дозволяє одному об'єкту здобувати властивості іншого об'єкта, не плутайте з копіюванням об'єктів. При копіюванні створюється точна копія об'єкта, а при спадкуванні точна копія доповнюється унікальними властивостями, які характерні тільки для похідного об'єкта.
Клас - це базове поняття в ООП. Класи утворюють синтаксичну базу ООП. Їх можна розглядати як свого роду "контейнери" для логічно зв'язаних даних і функцій (звичайно називаних методами). Якщо сказати простіше, то клас - це своєрідний тип даних.
Екземпляр класу - це об'єкт. Об'єкт - це сукупність даних (властивостей) і функцій (методів) для їхньої обробки. Властивості й методи називаються членами класу. Взагалі, об'єктом є все те, що підтримує інкапсуляцію.
Якщо клас можна розглядати як тип даних, то об'єкт - як змінну (за аналогією). Скрипт може одночасно працювати з декількома об'єктами одного класу, як з декількома змінними.
Усередині об'єкта дані й код (члени класу) можуть бути або відкриті, або ні. Відкриті дані й члени класу є доступними для інших частин програми, які не є частиною об'єкта. А от закриті дані й члени класу доступні тільки усередині цього об'єкта.
Опис класів в PHP починаються службовим словом class:
class Ім'я_класу {
// опис членів класу - властивостей і методів для їхньої обробки
}
Для оголошення об'єкта необхідно використовувати оператор new:
Об'єкт = new Ім'я_класу;
Дані описуються за допомогою службового слова var. Метод описується так само, як і звичайна користувальницька функція. Методу також можна передавати параметри.
За загальноприйнятими правилами імена класів ООП починаються із прописної букви, а всі слова в іменах методів, крім першого, починаються із прописних букв (перше слово починається з малої літери).
Приклад класу на PHP:
<?php
// Створюємо новий клас Coor:
class Coor {
// дані (властивості):
var $name;
var $addr;
// методи:
functіon Name() {
echo "<h3>John</h3>";
}
}
// Створюємо об'єкт класу Coor:
$object = new Coor;
?>
Доступ до класів і об'єктів в PHP
Ми розглянули, яким чином описуються класи й створюються об'єкти. Тепер нам необхідно одержати доступ до членів класу, для цього в PHP призначений оператор ->. Приведемо приклад:
<?php
……………….
// Одержуємо доступ до членів класу:
$object->name = "Alex";
echo $object->name;
// Виводить 'Alex'
// А тепер одержимо доступ до методу класу (фактично, до функції усередині класу):
$object->Getname();
// Виводить 'John' заголовними буквами
?>
Щоб одержати доступ до членів класу усередині класу, необхідно використовувати покажчик $thіs, котрий завжди ставиться до поточного об'єкта. Модифікований метод Getname():
functіon Getname() {
echo $thіs->name;
}
У такий же спосіб, можна написати метод Setname():
functіon Setname($name) {
$thіs->name = $name;
}
Тепер для зміни ім'я можна використовувати метод Setname():
$object->Setname("Peter");
$object->Getname();
А от і повний лістинг коду:
<?php
// Створюємо новий клас Coor:
class Coor {
// дані (властивості):
var $name;
// методи:
functіon Getname() {
echo $thіs->name;
}
functіon Setname($name) {
$thіs->name = $name;
}
}
// Створюємо об'єкт класу Coor:
$object = new Coor;
// Тепер для зміни ім'я використовуємо метод Setname():
$object->Setname("Nіck");
// А для доступу, як і колись, Getname():
$object->Getname();
// Сценарій виводить 'Nіck'
?>
Покажчик $thіs можна також використовувати для доступу до методів, а не тільки для доступу до даних.
Конструктори
Конструктор являє собою метод, що задає значення деяких властивостей (а також може викликати інші методи). Конструктори викликаються автоматично при створенні нових об'єктів. Щоб це стало можливим, ім'я методу-конструктора повинне збігатися з ім'ям класу, у якому він утримується. Приклад конструктора:
<?
class Webpage {
var $bgcolor;
functіon Webpage($color) {
$thіs->bgcolor = $color;
}
}
// Викликати конструктор класу Webpage
$page = new Webpage("brown");
?>
Можна викликати конструктор, що просто створює об'єкт, але не ініціалізує його властивості:
$page = new Webpage;
Об'єкт можна створити за допомогою конструктора, визначеного в класі:
$page = new Webpage("brown");
Деструктори
У РНР відсутня безпосередня підтримка деструкторів. Проте, ви можете легко імітувати роботу деструктора, викликаючи функцію РНР unset(). Ця функція знищує вміст змінної й повертає займані нею ресурси системі. З об'єктами unset() працює так само, як і зі змінними. Допустимо, ви працюєте з об'єктом $Webpage. Після завершення роботи із цим конкретним об'єктом викликається функція:
unset($Webpage);
Ця команда видаляє з пам'яті весь уміст $Webpage. Необхідність у виклику деструкторів виникає лише при роботі з об'єктами, що використовують великий обсяг ресурсів, оскільки всі змінні й об'єкти автоматично знищуються по завершенні сценарію.
Звертання до елементів класів
Звертання до елементів класів здійснюється за допомогою оператора :: "подвійна двокрапка". Використовуючи "подвійну двокрапку", можна звертатися до методів класів.
При звертанні до методів класів, програміст повинен використовувати імена цих класів.
<?php
class A {
functіon example() {
echo "Це первісна функція A::example().<br>";
}
}
class B extends A {
functіon example() {
echo "Це перепевна функція B::example().<br>";
A::example();
}
}
// Не потрібно створювати об'єкт класу A.
// Виводить наступне:
// Це первісна функція A::example().
A::example();
// Створюємо об'єкт класу B.
$b = new B;
// Виводить наступне:
// Це перепевна функція B::example().
// Це первісна функція A::example().
$ b-b->example();
?>
Поліморфізм є наслідком ідеї спадкування. Поліморфність класу - це властивість базового класу використовувати функції похідних класів, навіть якщо на момент визначення ще невідомо, який саме клас буде включати його в якості базового й, тим самим, ставати від нього похідним.
Розглянемо властивість поліморфності класів на основі наступного приклада:
<?php
class A {
// Виводить, функція якого класу була викликана