data[$k]; } public function __set($k, $v) { $this->data[$k] = $v; } public static function pdo(): PDO { static $pdo; return $pdo ??= new PDO(DB_DSN, DB_USER, DB_PASS, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]); } public static function all(): array { return static::pdo()->query("SELECT * FROM " . static::$table)->fetchAll(PDO::FETCH_CLASS, static::class); } public static function find(int $id): ?static { $stmt = static::pdo()->prepare("SELECT * FROM " . static::$table . " WHERE id = ?"); $stmt->execute([$id]); return $stmt->fetchObject(static::class) ?: null; } public function save(): void { $cols = implode(',', array_keys($this->data)); $vals = implode(',', array_fill(0, count($this->data), '?')); $sql = $this->data['id'] ? "UPDATE " . static::$table . " SET " . implode(' = ?, ', array_keys($this->data)) . " = ? WHERE id = ?" : "INSERT INTO " . static::$table . " ($cols) VALUES ($vals)"; $stmt = static::pdo()->prepare($sql); $stmt->execute($this->data['id'] ? array_values(array_merge($this->data, ['id' => $this->data['id']])) : array_values($this->data)); } public function delete(): void { static::pdo()->prepare("DELETE FROM " . static::$table . " WHERE id = ?")->execute([$this->data['id']]); } }