prepare($query); $stmt->execute($params); $stmt->setFetchMode(PDO::FETCH_CLASS, $output); return $stmt->fetch(); } public static function QueryAll(string $query, $params, $output = 'stdObject') { $stmt = self::$connection->prepare($query); $stmt->execute($params); $stmt->setFetchMode(PDO::FETCH_CLASS, $output); return $stmt->fetchAll(); } } abstract class BaseModel { protected static ?ISqlBase $sql = null; public static function Get(int $id) { static::Initialize(); return ConnectionManager::Query( self::$sql->Get(), ['id' => $id], get_called_class()); } protected static function QueryAll($sql, $params) { static::Initialize(); return ConnectionManager::QueryAll( $sql, $params, get_called_class()); } abstract public static function Initialize(); } interface IJobSql extends ISqlBase { public function GetLast10(): string; } class JobSql implements IJobSql { public function Get(): string { return "Select * from jobs where id = :id"; } public function GetLast10() { return "select * from jobs order by id desc limit 10"; } } class Job extends BaseModel { protected static IJobSql $sql; public int $id; public float $budget; public static function Initialize() { if (self::$sql === null) { self::$sql = new JobSql(); } } public static function GetLast10() { return self::QueryAll(self::$sql->GetLast10(), []); } } $dns = 'pgsql:host=localhost;port=5432;dbname=dynamic_dev;user=test;password=pass123'; ConnectionManager::Connect($dns); echo " "; var_dump(Job::Get(10)); echo " ";