PHP: Введение в ООП (13) (конспект Hexlet)

  1. О курсе
    1. Основные понятия
      1. Объекты
      2. Классы
      3. Интерфейсы
      4. Сокрытие данных (Data hiding)
      5. Инкапсуляция
      6. Автозагрузка
      7. Исключения
    2. Классы и объекты (нет в курсе)
  2. Структуры
    1. Абстракция реализованная через ассоциативные массивы не обеспечивает безопасность типов (можно ошибочно вызывать функцию, предназначенную для одной абстракции, например, точки, на другой абстракции, например, сегменте )
  3. Классы
    1. В PHP классы должны называться с заглавной буквы
    2. Ключевое слово public делает свойства публичными, то есть доступными снаружи для чтения и модификации (по аналогии со структурами, ассоциативными массивами
    3. instance – экземпляры класса
    4. new Point() – создание экземпляра класса Point
    5. $point->x = 5 – доступ к свойстве через “->
    6. gettype($circle); // object; gettype() – определение типа переменной
  4. Автозагрузка классов
    1. Принято определять ровно один класс на файл
    2. В этом файле больше не может быть никаких инструкций, не считая определения пространств имён (необязательно, но следует из стандартов кодирования PSR-12.)
    3. Если пространство имен содержит только функции, то пространство имен заканчивается на файл
      <?php
      // file: src/solution.php
      namespace App\solution;
      function
    4. Для классов следующий синтаксис (файл должен называться в точности как класс и с учётом регистра)
      <?php
      // file: src/Point.php
      namespace App;
      class Point
      {
      }
    5. Использование класса
      1. Первый вариант:
        <?php
        namespace AnotherApp;
        use App\Point;
        $point = new Point();
      2. Второй вариант
        <?php
        namespace AnotherApp;
        $point = new \App\Point();
    6. Полное описание требований в стандарте PSR-4
    7. В отличии от функций (autoload/files , composer.json , require __DIR__ . ‘/vendor/autoload.php’; )
      “autoload”: {
      “files”: [
      “src/Points.php”,
      “src/Segments.php”
      ]
      }
      для классов в PHP есть специальный механизм автозагрузки (пример) .
      “autoload”: {
      “psr-4”: {“App\\”: “src/”}
      }
      т.е в папке src относительно расположения файла composer.json находится пространство имён App
    8. Дополнительные материалы
      1. Официальная документация
    9. Неймспейс для класса, находящегося по пути src/My/Super/Klass.php – MyApp\My\Super
  5. Свойства
    1. Доступно динамическое обращение к свойствам
      <?php
      $propertyName = ‘key’;
      $obj->$propertyName = ‘value’;
      $obj->$propertyName;
      // value $obj->key; // value
    2. Дополнительные материалы
      1. Официальная документация
  6. Указатели
    1. Передача объектов(в параметрах функций, при присвоении переменной и пр.) происходит “как по ссылке”.
    2. Дополнительные материалы
      1. Объекты и ссылки
  7. Сравнение объектов
    1. На практике стандартное сравнение может не подойти и приходится реализовывать свой метод объекта для сравнения
    2. класс можно указывать в определении функции – function areUsersEqual(User $user1, User $user2) (при передачи в функцию значения типа отличного от объекта класса User – вылетит ошибка)
  8. Конструктор
    1. Пример конструктора
      class Point
      {
      public $x;
      public $y;
      public function __construct($x, $y)
      {
      $this->x = $x;
      $this->y = $y;
      }
      }
      Функцию __construct нельзя вызвать, она вызывается автоматически при создании объекта класса
    2. Конструктор не должен ничего возвращать
    3. “Внутренний” вызов конструктора – __construct($this, $x, $y), где $this – созданный объект класса
    4. Основная задача конструктора — заполнить свойства объекта переданными параметрами
    5. Дополнительные материалы
      1. Официальная документация
  9. Инкапсуляция
    1. Инкапсуляция (англ.encapsulation, от лат.in capsula) — в информатике размещение в одном компоненте данных и методов, которые с ними работают
    2. Методы, которые извлекают составные части объекта – геттеры (getters)
    3. Методы, изменяющие составные части — сеттеры (setters)
    4. Дополнительные материалы
      1. Область видимости
  10. Сокрытие данных (Data Hiding)
    1. Вариант обхода private – использование ссылок
  11. Изменяемость
    1. Правило именования сеттеров
      1. префикс set, если этот сеттер что-то устанавливает
      2. префикс add — если добавляет
    2. Markdown
  12. Магический метод __toString()
    1. Префикс магических методов – “__”
    2. __toString вызывается автоматически, когда объект используется как строка (например при интерполяции или конкатенации)
    3. при использовании print_r метод __toString не вызовется
    4. если __toString возвращает не строку или у объекта нет метода toString при преобрвзовании объекта в строку произойдет ошибка
    5. __toString
  13. Константы классов
    1. Константы должны хранить данные (неизменяемые), имеющие отношение ко всему типу в целом, а не к его объектам
    2. Доступ к константе через “:”: DateTime::RSS
    3. Внутри класса можно обратиться так: self::RSS
    4. Предопределенные константы (не требуют префикса ” self “)
      1. __CLASS__ — текущее имя класса
      2. __METHOD__ — текущее имя метода
    5. Константа ” class ” – вызывается только через имя класса ( возвращает полное имя класса относительно пространство имёна, в котором происходит её вызов )
    6. с 7.1 константы имеют модификаторы (public, private)
    7. Дополнительные материалы
      1. Официальная документация
  14. Статические свойства
    1. Статическое свойство, в отличие от обычного свойства, принадлежит классу, а не экземпляру (ключевое слово static: public static $table = 'users';)
    2. обращение к статическому свойству как к константам: User::$table
    3. В отличие от констант, свойства требуют наличия знака $
    4. Для доступа к статическому свойству можно использвоать объект: $user::$table
    5. Правильно инициировать статические свойства вначале, делать их приватными а доступ через статические методы
    6. Дополнительные материалы
      1. Официальная документация
      2. Позднее статическое связывание
  15. Статические методы
    1. Использование в качестве
      1. нескольких “конструкторов”: new self(date("Y-m-d H:i:s"), $timezone);
      2. глобальные функции пространства имен
    2. Дополнительные материалы
      1. Официальная документация
    3. [$h, $m] = explode(':', $time); // для напоминания
  16. Интерфейсы (ключевое слово `interface`)
    1. интерфейс в PHP — конструкция языка, описывающая абстрактный тип данных (АТД)
    2. на практике интерфейсы содержат определения функций (то есть описание их сигнатур) без их реализации
    3. Интерфейсы описываются как и классы в отдельном файле
    4. Пример описания: interface DecartPointInterface
    5. Стандарт PSR-4
    6. Реализация интерфейса – ключевое слово implementsclass DecartPoint implements DecartPointInterface
    7. Множественная реализация интерфейсов – class Stack implements \IteratorAggregate, \ArrayAccess, Collection
    8. Использование интерфейса в сигнатурах функций: function compare(DecartPointInterface $point1, DecartPointInterface $point2)
    9. Разные интерфейсы не могут иметь одинакоые методы
    10. Дополнительные материалы
      1. Официальная документация
      2. Отделенный интерфейс
      3. Абстрактный тип данных
    11. Плюсы и минусы разных способов организации абстракций
      1. Преимущества
        1. Полиморфизм подтипов
        2. Инкапсуляция
        3. Автокомплит (доп ссылки: Unified Function Call, Nim)
        4. Сокрытие данных (обход сокрытия с помощью Reflection API)
      2. Недостатки
        1. Инкапсуляция – проблема расширяемости
        2. Раздувание программы (доп. ссылка: FizzBuzzEnterpriseEdition)
        3. Слишком много языковых сущностей (Бритва Оккама)
        4. Примеры: абстрактные классы, анонимные классы, интерфейсы, статические методы, видимость методов, видимость свойств, видимость констант, трейты, магические методы, наследование
      3. Дополнительные материалы
        1. Изоморфизм Рича Хикки
    12. Исключения
      1. Коды возврата -> Исключения
      2. Код, в котором произошла ошибка, выбрасывает исключение, а код, в котором ошибка обрабатывается – её ловит
      3. Исключение: throw new \Exception("text exception")
      4. Поймать исключение:
        try {
        // Функция, которая вызывает readFile. Возможно не напрямую, а через другие функции.
        // Для механизма исключений это не важно.
        openFile($filepath);
        } catch (\Exception $e) {
        // Этот блок выполняется только в одном случае, если в блоке try было выброшено исключение
        showErrorToUser($e);
        }
      5. объекты класса \Exception  содержат сообщение, переданное в конструктор, трассировка стека и другие полезные данные:
        protected string $message ;
        protected int $code ;
        protected string $file ;
        protected int $line ;
        final public getMessage ( void ) : string
        final public getPrevious ( void ) : Throwable
        final public getCode ( void ) : mixed
        final public getFile ( void ) : string
        final public getLine ( void ) : int
        final public getTrace ( void ) : array
        final public getTraceAsString ( void ) : string
        public __toString ( void ) : string
      6. throw прерывает дальнейшее выполнение кода, до ближайшего в стеке вызовов блока catch
      7. Дополнительные материалы
        1. Официальная документация
        2. Коды возврата & исключения
        3. Библиотека safe
      8. Из задания
        1. Чтобы вызвать встроенную функцию из функции с таким же названием необходимо перед вызовом встроенной добавить символ “\”. (подробнее)
        2. Ответы функции json_decode
          1. json_last_error_msg()
          2. json_last_error()