我正在尝试学习OOP php,当我正在开发一个登录/注册系统时,我注意到我在Users类的每个函数中都调用了数据库clase。
例如,像这样:
<?php
class Users {
public function signUp($username, $email, $password){
$db = new Database;
$dbh = $db->connect();
$sql = "INSERT INTO users (username, email, password) VALUES (?, ?, ?)";
try {
$query = $dbh->prepare($sql);
$query->execute(array($username, $email, $password));
echo 'succ';
} catch (Exception $ex) {
echo $ex->getMessage();
}
}
基本上,在没有复制整个文件的情况下,我有一些与数据库一起工作的函数,在每一个函数中我都要调用这两行:
$db = new Database;
$dbh = $db->connect();
所以我在互联网上查找了一下spl_autoload_register。它在大多数情况下工作得很好,但我似乎无法像这样替换上面的两行:
$db = new Database;
$dbh = Database::connect();
因为我从我的数据库类中得到了另一个错误:
在D:\ xampp \ htdocs \ PHP中不在对象上下文中时使用$ this 第24行的OOP \ customSystem \ Classes \ Class.Database.php
第24行是此函数的返回
public function connect(){
return $this->conn;
}
我不知道现在要做什么,但它也不会在每个函数中调用Database类来解决我的初始问题。那么,我需要做什么?
答案 0 :(得分:1)
您应该将DB类作为依赖项传递。
看起来应该是这样的
class Users {
private $dbh;
public function __construct(\PDO $dbh)
{
$this->dbh = $dbh;
}
public function signUp($username, $email, $password)
{
$sql = "INSERT INTO users (username, email, password) VALUES (?, ?, ?)";
try {
$query = $this->dbh->prepare($sql);
$query->execute(array($username, $email, $password));
echo 'succ';
} catch (Exception $ex) {
echo $ex->getMessage();
}
}
}
此方法允许您将相同的 PDO实例传递给所有需要它的类。您还可以使用工厂来进一步改进代码,该工厂负责创建所有需要PDO作为依赖关系的类,如this answer中所述。
答案 1 :(得分:-1)
当您静态调用方法Database::connect();
时,您无法引用$this
$this
是对您对象的现有实例的引用。
因此,当您通过new Database()
创建新实例时,可以在Database类方法中使用$this
指针。
了解有关静态事物的更多信息并尝试使用此功能:
class Database
{
private static $instance = null;
private static $conn = null;
private function __construct()
{
try {
$dbh = new PDO(DB_SOCKET_TYPE . ':host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=utf8', DB_USER, DB_PASSWORD);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
self::$conn = $dbh;
} catch (PDOException $e) {
echo $e->getMessage();
}
}
private function getDbConnection()
{
return self::$conn;
}
public static function connect()
{
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance->getDbConnection();
}
}
// how to use it? for eg.
$sql = 'INSERT INTO users (username, email, password) VALUES (?, ?, ?)';
$query = Database::connect()->prepare($sql);
$query->execute(array($username, $email, $password));
对不起任何错误,但我写的很快,没有测试它 我希望它有用