Присвоение переменной класса из подкласса без конструктора

Я создаю облегченный слой Model для доступа к базе данных моего проекта. Я хотел бы, чтобы это было в духе Ruby on Rails. Вместо создания нового объекта Model я хочу использовать одноэлементный подход. Вот текущая проблема, с которой я сталкиваюсь:

class BaseModel {
    public static $name;
    public static function get($id) {
        echo "SELECT * FROM ". self::$name ."s WHERE ". self::$name .' = '.$id;
    }
}

class Customer extends BaseModel {
    //parent::$name = 'customer'; => ERROR
}

$c = Customer::get(4);

Есть ли способ назначить статические члены родителя в теле класса? Я хотел бы избежать создания реального синглтон-класса, если это возможно. Благодарю.

1 ответ

Решение

Функция, которую вы ищете, называется Late Static Binding (LSB) и, к счастью, была введена в PHP в 5.3. Вы можете прочитать об этом здесь: http://php.net/manual/en/language.oop5.late-static-bindings.php

Это ваш код, переписанный с использованием LSB.

<?php

class BaseModel {
    public static $name;
    public static function get($id) {
        echo "SELECT * FROM ". static::$name ."s WHERE ". static::$name .' = '.$id;
    }
}

class Customer extends BaseModel {
    public static $name = 'customer';
}

$c = Customer::get(4);
?>
Другие вопросы по тегам