Object
Клас - це шаблон або зразок, що описує змінні і функції для конкретного виду об'єкта.
Метод - це функція, визначена в класі.
Властивість (свойство) - це змінна, визначена в класі.
Екземпляр - це окремий приклад застосування класу. Створення нового екземпляра класу називається отриманням екземпляра об'єкта.
Конструктор - це спеціальний метод, який виконується автоматично при отриманні примірника об'єкта. Як правило, в конструкторах встановлюються властивості об'єктів і виконуються інші службові операції, що готують об'єкт до застосування.
Статичний метод - це особливий різновид методу, який можна викликати, не отримуючи екземпляр класу. Статичні методи не залежать від значень властивостей конкретного екземпляра
Зміст:
- Приклад 6.1. Визначення класу
- Приклад 6.2. Створення і застосування об'єктів
- Приклад 6.3. Визначення статичного методу
- Приклад 6.5. Ініціалізація об'єкта в конструкторі
- Приклад 6.7. Генерування винятку
- Приклад 6.9. Обробка винятку
- Приклад 6.10. Розширення класу Entree
- Приклад 6.11. Застосування підкласу
Конструктори
Індикація помилок за допомогою винятків
Приклад 6.1. Визначення класу
<?php class Entree { public $name; public $ingerdients = array(); public function hasingredient($ingredient) { return in_array($ingredient, $this->ingredients); } } //створити екземпляр та присвоїти його змінній $soup $soup = new Entree; //встановити властивості екземпляра в змінній $soup $soup->name ='Chicken Soup'; $soup->ingredients = array('chicken', 'water'); //створити окремий екземпляр і присвоїти його змінній $sandwich $sandwich = new Entree; //встановити властивості екземпляра в змінній $sandwich $sandwich->name = 'Chicken Sanwich'; $sandwich->ingredients = array('chicken', 'bread'); foreach (['chicken', 'lemon', 'bread', 'water'] as $ing) { if ($soup->hasingredient($ing)) { print "Soup contains $ing.<br>\n"; } if ($sandwich->hasingredient($ing)) { print "Sanwich contains $ing.<br>\n"; } } ?>
Приклад 6.2. Створення і застосування об'єктів
<?php //створити екземпляр та присвоїти його змінній $soup $soup = new Entree; //встановити властивості екземпляра в змінній $soup $soup->name ='Chicken Soup'; $soup->ingredients = array('chicken', 'water'); //створити окремий екземпляр і присвоїти його змінній $sandwich $sandwich = new Entree; //встановити властивості екземпляра в змінній $sandwich $sandwich->name = 'Chicken Sanwich'; $sandwich->ingredients = array('chicken', 'bread'); foreach (['chicken', 'lemon', 'bread', 'water'] as $ing) { if ($soup->hasingredient($ing)) { print "Soup contains $ing.<br>\n"; } if ($sandwich->hasingredient($ing)) { print "Sandwich contains $ing.<br>\n"; } } ?>Soup contains chicken.
Sandwich contains chicken.
Sandwich contains bread.
Soup contains water.
Приклад 6.3. Визначення статичного методу
<?php class Entree { public $name; public $ingerdients = array(); public function hasingredient($ingredient) { return in_array($ingredient, $this->ingredients); } public static function getSizes() { return array('small', 'medium', 'large'); } } ?>
Чтобы вызвать статический метод, следует вставить знаки между именами класса и метода вместо знаков ->, как показано в примере 6.4
$sizes = Entree::getSizes();
Конструктори
У класса может быть специальный метод, называемый конструктором и выполняемый при создании объекта. Конструкторы обычно выполняют установочные и служебные операции для подготовки объекта к применению. В качестве примера можно внести изменения в класс Entree, назначив для него конструктор. Такой конструктор принимает следующие аргументы: наименование блюда и список его ингредиентов. Передавая эти значения конструктору, можно избежать установки свойств после создания объекта. Метод-конструктор класса в РНР всегда называется __construct() .
В примере 6.5 демонстрируется измененный класс вместе с его методом-конструктором
метод-конструктор __construct() принимает два аргумента и присваивает их значения свойствам класса. Вызывая операцию new, значения аргументов следует указывать после нее в круглых скобках, а для передачи аргументов конструктору - рассматривать имя класса как имя функции. В примере 6.6 демонстрируется применение конструктора класса Entree для создания экземпляров объектов $soup и $sandwich, аналогичных упоминавшимся вышеПриклад 6.5. Ініціалізація об'єкта в конструкторі
<?php
class Entree {
public $name;
public $ingredients = array();
public function __construct($name, $ingredients) {
$this->name = $name;
$this->ingredients = $ingredients;
}
public function hasingredient($ingredient) {
return in_array($ingredient, $this->ingredients);
}
}
?>
Пример 6.6. Вызов конструктора
//суп, його назва та інгредієнти
$soup = new Entree('Chicken Soup', array('chicken', 'water'));
//Сендвіч, його назва та інгредієнти
$sandwich = new Entree('Chicken Sandwich', array('chicken', 'bread'));
Індикація помилок за допомогою винятків
В примере 6.7 демонстрируется конструктор класса Entree, в который внесены изменения для генерирования исключения в том случае, если аргумент $ingredients не содержит массив. (Генерирование исключения означает применение исключения для уведомления интерпретатора РНР о неверном ходе выполнения кода.)
Приклад 6.7. Генерування винятку
<?php class Entree { public $name; public $ingredients = array(); public function __construct($name, $ingredients) { if (!is_array($ingredients)) { throw new Exception('$ingredients must be an array'); } $this->name =$name; $thes->engredients = $ingredients; } public function hasingredient($ingredient) { return in_array($ingredient, $this->ingredients); } } ?>
Исключения представлены в классе Exception. В качестве первого аргумента конструктору класса Exception передается символьная строка, описывающая причину сбоя в коде. Таким образом, в строке кода
throw new Exception (' $ingredients must Ье an array');
создается новый объект типа Exception, который затем передается языковой конструкции throw с целью прервать работу интерпретатора РНРВ примере 6.9 демонстрируется порядок ввода в исходный код блоков операторов try и catch для обработки исключения.
Приклад 6.9. Обробка винятку
try { $drink = new Entree('Glass of Milk', 'milk'); if ($drink->hasingredient('milk')) { print "Yummy!"; } } cath (Exception $e) { print "Could't create the drink: " . $e->getMessage(); }
В коде из примера 6.9 блоки операторов try и catch действуют совместно. Операторы в блоке try выполняются по очереди до тех пор, пока не возникнет исключение. В этом случае интерпретатор РНР перейдет сразу к блоку оператора catch, присвоив переменной $е созданный при этом объект типа Exception. А в коде, находящемся в блоке catch, автоматически вызывается метод getMessage() из класса Exception для извлечения текста сообщения, заданного для исключения при его создании. При выполнении кода из примера 6.9 на экран выводится следующий результат:
Couldn't create the drink : $ingredients must Ье an array
Приклад 6.10. Розширення класу Entree
<?php class ComboMeal extends Entree { public function hasingredient($ingredient) { foreach ($this->ingredients as $entree) { if ($entree->hasingredient($ingredient)) { return true; } } return false; } } ?>
В коді, extends Entree повідомляє інтерпретатору PHP, що клас ComboMeal повинен наслідувати від класу Entree всі його методи і властивості.
Приклад 6.11. Застосування підкласу
<?php //Суп, його назва і інгредієнти $soup = new Entree('Chicken Soup', array('chicken', 'water')); //Сендвіч, його назва і інгредієнти $sandwich = new Entree('Chicken Sandwich', array('chicken', 'bread')); // Составное блюдо $соmbо = new ComЬoMeal('Soup + Sandwich', array($soup, $sandwich)); foreach (['chicken', 'water', 'pickles'] as $ing) { if ($combo->hasingredient($ing)) { print "Something in the соmЬо contains $iпg.\n"; } }