@VisualIdeas

Как обратится к свойству потомка из родителя?

Добрый день всем.

Есть небольшая абстракция над БД в виде:
Основной класс Table, в нем есть свойство tableName которое ичпользуется во всех методах для построения sql запроса
Методы определяют стандартные действия с таблицами

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

public static $tableName = 'drivers_models';

    public static function getItemsById($array)
    {
        parent::$tableName = self::$tableName;

        $data = parent::getItemsById($array);
        
        // ...

        return $data;
    }


Как мне избежать подобного копирования кода?
Возможно ли обратится к свойству потомка который вызвал метод?
  • Вопрос задан
  • 580 просмотров
Решения вопроса 1
Это называется позднее статическое связывание. вместо parent:: или self:: используйте static::.
Тут подробнее.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@shaqster
Symfony3 Guru
Кошмарная архитектура.

Сделайте класс Table абстрактным, сделайте там общие для всех дочерних классов методы, абстрактные методы, свойство tableName - protected с пустым значением. В дочерних классах все переопределяйте, в коде работайте с абстракцией Table, но с конкретными экземплярами.

Родитель не должен ничего знать о своих потомках, это рушит всю логику.
Ответ написан
Комментировать
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
А разрешите спросить, зачем вам статик? Может я чего то недопонимаю? Не проще сделать нестатический метод и нормально создавать экземпляр и юзать $this?
Ответ написан
Комментировать
slo_nik
@slo_nik Куратор тега PHP
А если в родительском классе принимать нужный параметр?

что-то вроде этого
$data = parent::getItemsById($array, $this->tableName);


или вообще, не создавая $tableName, передать вторым параметром строку с именем таблицы...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы