What are the best practices for handling database connections and object instantiation in PHP to avoid this error?

When handling database connections and object instantiation in PHP, it is important to ensure that connections are properly closed after they are no longer needed to prevent running out of available connections. One way to avoid this error is to use a try-catch block to handle exceptions and ensure that connections are closed in a finally block. Additionally, using a singleton pattern for database connections can help manage connections more efficiently.

<?php

class Database {
    private static $instance = null;
    private $connection;

    private function __construct() {
        $this->connection = new PDO('mysql:host=localhost;dbname=mydatabase', 'username', 'password');
    }

    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new self();
        }

        return self::$instance;
    }

    public function getConnection() {
        return $this->connection;
    }

    public function closeConnection() {
        $this->connection = null;
    }
}

try {
    $db = Database::getInstance();
    $connection = $db->getConnection();

    // Perform database operations

} catch (PDOException $e) {
    // Handle exception
} finally {
    $db->closeConnection();
}