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