У меня есть основной класс
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
значение, так как оно пустое в родительском классе.
Есть идеи, как сделать эту работу?
использование static
вместо self
в методе:
public static function fetch(int $id)
{
$self = new static;
$result = $self->where(['id' => $id])->get();
return $result;
}
Таким образом, вы получите экземпляр расширенного класса (например, Users
), но не тот, в котором объявлен метод (т.е. Database
).
Вы пытаетесь разрешить класс во время выполнения. 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
, вы получите класс, где код фактически выполняется.