我是新手使用命名空间。在这个例子中,我创建了类,它处理数据库连接,我试图在其他类中使用它。你能解释一下是什么问题吗?
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();
...
提前致谢。
编辑:好的,现在我已经加入了自动加载器,包括类现在正常工作。但现在我在$dbh
$query = $this->dbh->query("SELECT * FROM...");
时遇到错误
致命错误:调用未定义的方法Database \ Connection :: query() 在...
答案 0 :(得分:1)
我将为第一个问题添加答案(对您有用)以供参考:“命名空间不会自动加载文件。您需要为此添加自动加载器。” < / p>
Fatal error: Call to undefined method Database\Connection::query()
答案在错误消息中。您已将类Database\Connection
变为单个,其中Database\Connection::get()
返回自身的实例(没有任何->query()
方法),而不是实际的PDO
实例
如果您希望该方法返回PDO
实例,我会做这样的事情:
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;
}
}
现在Connection
类已成为PDO连接的工厂。
Connection::get()
会一遍又一遍地返回相同的PDO
个实例,您应该可以从$this->dbh->query("...")
课程中致电Auth
。