Статические свойства и наследование в PHP

348
20 октября 2017, 15:23

Хотелось бы услышать мнение сообщества по поводу правильного оформления классов при наследовании. Чтобы не лить воду, перейду сразу к примеру. Есть базовый класс:

<?php
abstract class Animal 
{
    public static function classes()
    {
        return [
            Dog::TYPE_ID => Dog::class,
            Cat::TYPE_ID => Cat::class,
        ];
    }
    public function getTypeId()
    {
        return static::TYPE_ID;
    }
    public function getTypeAlias()
    {
        return static::TYPE_ALIAS;
    }
    public function getTypeTitle()
    {
        return static::TYPE_TITLE;
    }
}

Есть классы-наследники:

<?php
class Dog extends Animal 
{
    const TYPE_ID = 1;
    const TYPE_ALIAS = 'dog';
    const TYPE_TITLE = 'Собака';
    // Dog related methods
    public function sayWoof() {}
}
class Cat extends Animal
{
    const TYPE_ID = 2;
    const TYPE_ALIAS = 'cat';
    const TYPE_TITLE = 'Кошка';
    // Cat related methods
    public function sayMeow() {}
}

То есть, допустим, у нас есть некий журнал учета животных в приюте. Все записи о животных хранятся в одной таблице БД. В этой таблице есть поле INT type_id, в котором хранится тип животного и на основе которого, при извлечении данных, инстанцируются соответствующие классы (Single Table Inheritance).

Так вот, собственно, что меня смутило. Я использовал константы для определения свойств в дочерних классах - вроде бы свойства классов постоянные и неизменяемые, НО: 1. В абстрактном классе Animal, PhpStorm ругается - мол, нет таких констант в данном классе. Добавление констант-пустышек, только лишь бы удовлетворить IDE, кажется не очень хорошей идеей. 2. Иногда, при использовании констант для таких целей, получается их переопределение (override) в дочерних классах, а это тоже, как я читал на StackOverflow, не очень хорошая практика. Типа константа должна быть константой).

Но есть и определенные плюсы: 1. Можно обратиться к свойствам классов без создания экземпляра. Например, чтобы получит список классов всех видов животных в БД (как в методе Animal::classes()). 2. Константы не 'висят' в самом экземпляре класса, например если сделать var_dump(new Dog()), в отличии от свойств класса. Может, даже, это как-то поможет в экономии памяти если свойств много (я предполагаю из сравнения с prototype в JS). 3. Для глаза как-то чище и приятнее код.

Расскажите свое мнение по этому поводу. Может лучше использовать статические свойства? Или можете предложить свои примеры решения таких ситуаций?

READ ALSO
Как загрузить папку с файлами?

Как загрузить папку с файлами?

Можно ли как то выбрать для загрузки папку(например документы и внутри 5 файлов) , а не 1 файл в папке (нужно переместить или скопировать папку...

278
Заголовки столбцов CSV

Заголовки столбцов CSV

Есть модуль, успешно выгружающий данные из MySQL в файл в CSV-файл Первая строка файла - заголовки столбцов Пример выгрузки date;time;data_collumn1;data_collumn2;data_collumn3...

240
Websocket SERVER-PHP | CLIENT-JS

Websocket SERVER-PHP | CLIENT-JS

Собственно вопрос, какие библиотеки могут помочь в реализации сокета между сервером на php и клиентом на js, пробовал разные библиотеки но они...

232
wp плагин не работает на страницах

wp плагин не работает на страницах

Сделал небольшой плагин, он прекрасно работает, когда создаешь пост, но вообще не работает, когда создаешь страницуВ интернете не могу найти...

342