简体   繁体   中英

PHP class not found with namespaces

I'm new to using namespaces. In this example I made class, which handles database connection and I'm trying to use it inside the other classes. Can you explain what is wrong?

Connection.php

namespace Database;

class Connection
{
    private static $instance = null;

    private $pdo;

    private function __construct()
    {
        $this->pdo = new PDO("mysql:host=localhost;dbname=database;", "root", "pw");
    }

    public static function get()
    {
        if (is_null(self::$instance))
            self::$instance = new Connection();
        return self::$instance;
    }
}

Auth.php

namespace PHPAuth;

use Database\Connection;

class Auth
{
    protected $dbh;

    public function __construct()
    {
        $this->dbh = Connection::get();
        ...

Thanks in advance.

Edit: Ok, now I included autoloader and including class is now working correctly. But now I'm getting error when using $dbh in Auth like $query = $this->dbh->query("SELECT * FROM...");

Fatal error: Call to undefined method Database\\Connection::query() in...

First issue with class not found

I'll add the answer (which worked for you) for the first issue for reference: "Namespaces doesn't automatically load the files. You need to add an autoloader for that."

Second issue with undefined method

Fatal error: Call to undefined method Database\\Connection::query()

The answer is in the error message. You've made the class Database\\Connection into a singleton where Database\\Connection::get() returns an instance of itself (which doesn't have any ->query() method), and not the actual PDO instance.

If you want that method to return the PDO instance instead, I would do something like this:

namespace Database;

use PDO;

class Connection
{
    private static $pdo;

    private function __construct() 
    {
        // Leave the constructor private so it still becomes
        // a singleton and so we can't instantiate this class.
    }

    public static function get()
    {
        if (is_null(self::$pdo)) {
            self::$pdo = new PDO("mysql:host=localhost;dbname=database;", "root", "pw");
        }

        return self::$pdo;
    }
}

Now the Connection class have become a Factory for the PDO-connection.

Connection::get() will return the same PDO instance over and over and you should be able to call $this->dbh->query("...") from your Auth class.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM