Skip to content

Азы объектов

Класс описывает переменные, свойства, процедуры и события объекта. Объекты являются экземплярами классов. Определив класс, вы можете создать из него любое количество объектов.

Microsoft, определение различий

Те условно говоря, любой наш проинициализированный класс является объектом.Пример:

// Наш класс
class ShopProduct {}

// Объекты нашего класса
$product1 = new ShopProduct();
$product2 = new ShopProduct();

Дополнительные поля данных в классах — называются свойства. Главная особенности, эти данные могу варьироваться от объекта к объектуПример:

class ShopProduct {
        public $title = "Название товара не задано";
        public $producerName = "Название производителя товара";
        public $producerFirstName = "ИМЯ производителя товара не задано";
        public $price = "Цена товара не задано";
}

Из-за того, что данные свойства public — мы спокойно можем пере-присвоить их в рамках объекта. Дать новое значение

Пример:

// Объекты нашего класса
$product1 = new ShopProduct();
$product2 = new ShopProduct();

$product1->title = "Полезный товар";

Важный момент, свойства могут быть только у объекта, что не очень хорошо. Те допустим, если выполнить код:

// Объекты нашего класса
$product1 = new ShopProduct();
$product2 = new ShopProduct();

$product1->titleUnExisted = "Полезный товар";

Никаких ошибок не будет, тк по мнению интерпретатора ничего страшного не случилось. Это может посадить огромное количество ошибок. Поэтому так взаимодействовать даже с public свойствами нельзя.


Методы — это специальные функции, объявляемые в классе. Что бы не запутаться: функции вне тела класса, в теле класса — методы

Создание метода конструктораВсе как и везде, вызывается метод __contructor() при инициализации, через который можно прокинуть значения свойств и выполнить всю логику, что бы класс являлся рабочим

Но в книге есть крутая штука, свойства можно передавать не параметрами в метод, а просто обозначать свойства прямо в конструкторе.


class ShopProduct {
        public function __construct() {
            public $title,
            public $producerFirstName = "",
            public $producerLastName = "",
            public $price = 0,
        }
}

$instance = new ShopProduct("Книга о саморазвитии!");

И все будет отлично работать!

!! именованные аргументы

$product1 = new ShopProduct( 
        price: 0.7,
        title: "Каталог книг "
);

Работает как магия, куча сахара. Но как приятно!



Наследование — это механизм, посредством которого один или несколько классов можно получить из некоторого базового класса.

Наследования

// Листинг 3.64
// Класс ShopProduct...
public function getSummaryLine(): string
  $base = "{$this->title} ( {$this->producerMainName} ,"
  $base .= "{$this->producerFirstName} )";
  return $base;
}
// Листинг 3.65
// Класс BookProduct...
public function getSummaryLine(): string
  {
  $base = parent::getSummaryLine();
  $base .=
  {$this->numPages} стр.";
  return $base;
}

:::tip Забавный кейс. Можно у класса родителя оставлять метод, а потом его просто дополнять. Я просто не думаю об этом. Вероятно в конструкторе все круто, но вот что так можно использовать в обычных методах — я не думал. Крутой кейс

:::

Управление доступом к классам: модификаторы public, private и protected

Элементы класса можно объявить как public (открытые), private (закрытые) или protected (защищенные). Это означает следующее.

  • К открытым свойствам и методам можно получать доступ из любого контекста.
  • К закрытому свойству и методу можно получить доступ только из того класса, в котором они объявлены. Даже подклассы данного класса не имеют доступа к таким свойствам и методам.
  • К защищенным свойствам и методам можно получить доступ либо из содержащего их класса, либо из его подкласса. Никакому внешнему коду такой доступ не предоставляется.

Ключевые слова для поиска

Классы и объекты — основные понятия ООП Объект как экземпляр класса Свойства объектов — определение и использование Public, private, protected модификаторы доступа Методы класса — объявление и использование Конструктор в классе (__construct) инициализация объекта Передача свойств через конструктор Наследование классов и методы родительского класса Объявление и использование методов и свойств в классе Переопределение методов в наследуемых классах Именованные аргументы при создании объектов Ошибки при работе с public свойствами ООП на примере PHP