Home

Object

Клас - це шаблон або зразок, що описує змінні і функції для конкретного виду об'єкта.

Метод - це функція, визначена в класі.

Властивість (свойство) - це змінна, визначена в класі.

Екземпляр - це окремий приклад застосування класу. Створення нового екземпляра класу називається отриманням екземпляра об'єкта.

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

Статичний метод - це особливий різновид методу, який можна викликати, не отримуючи екземпляр класу. Статичні методи не залежать від значень властивостей конкретного екземпляра

Зміст:

Приклад 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 демонстрируется измененный класс вместе с его методом-конструктором

Приклад 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);
                }
              }
              ?>
            

метод-конструктор __construct() принимает два аргумента и присваивает их значения свойствам класса.

Вызывая операцию new, значения аргументов следует указывать после нее в круглых скобках, а для передачи аргументов конструктору - рассматривать имя класса как имя функции. В примере 6.6 демонстрируется применение конструктора класса Entree для создания экземпляров объектов $soup и $sandwich, аналогичных упоминавшимся выше

Пример 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";
                  }
                }