What best practices should be followed when structuring PHP code for a CMS that is database-independent?

When structuring PHP code for a CMS that is database-independent, it is important to use abstraction layers such as PDO or ORM frameworks to interact with the database. This allows for easy switching between different database systems without changing the core code. Additionally, separating database queries from the rest of the application logic using a repository pattern can help maintain a clear separation of concerns.

// Example of using PDO for database abstraction
try {
    $pdo = new PDO('mysql:host=localhost;dbname=database', 'username', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

// Example of using a repository pattern
class UserRepository {
    private $pdo;

    public function __construct(PDO $pdo) {
        $this->pdo = $pdo;
    }

    public function getUserById($id) {
        $stmt = $this->pdo->prepare('SELECT * FROM users WHERE id = :id');
        $stmt->bindParam(':id', $id);
        $stmt->execute();
        return $stmt->fetch(PDO::FETCH_ASSOC);
    }
}

$userRepository = new UserRepository($pdo);
$user = $userRepository->getUserById(1);