Используйте статический родительский экземпляр с расширенными значениями экземпляра

У меня есть основной класс

abstract class Database
{
protected $table;

public function where(array $params)
{
// ...
}

public function get()
{
// ...
}
}

и тогда я использую расширенные версии класса:

Users extends Database
{
protected $table = 'users';
}

Теперь, когда мне нужно выбрать пользователей, я просто использую:

$db = new Users();
$results = $db->where(['id' => 1])->get();

Это прекрасно работает, но я решил, что было бы неплохо создать статический ярлык специально для запросов по id, но у меня возникают проблемы со статистической инициализацией класса.
Я создал метод fetch, который должен установить Id и сделать возврат с найденным объектом.

class Database // Had to drop abstract, since self cant be used
{
protected $table;

public static function fetch(int $id)
{
$self = new self;
$result = $self->where(['id' => $id])->get();

return $result;
}
}

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

Есть идеи, как сделать эту работу?

0

Решение

использование static вместо self в методе:

public static function fetch(int $id)
{
$self = new static;
$result = $self->where(['id' => $id])->get();

return $result;
}

Таким образом, вы получите экземпляр расширенного класса (например, Users), но не тот, в котором объявлен метод (т.е. Database).

1

Другие решения

Вы пытаетесь разрешить класс во время выполнения. self не поможет тебе Вам нужно использовать static для этого. Читать дальше поздние статические привязки.

class Database // Had to drop abstract, since self cant be used
{
protected $table;

public static function fetch(int $id)
{
$self = new static;
$result = $self->where(['id' => $id])->get();

return $result;
}
}

Так как вы использовали selfво время выполнения вы получите исходный базовый класс (класс, где self на самом деле используется). Используя static, вы получите класс, где код фактически выполняется.

1

По вопросам рекламы [email protected]