我想我在理解oop是如何工作的方面有问题。我已经修改了代码,但这不是我认为的正确方法。下面的场景(不,我不是自己创建用户登录,它实际上只是为了让本地开发人员更好地理解oop):
我有一个database.php文件:
class Database {
/* Properties */
private $conn;
private $dsn = 'mysql:dbname=test;host=127.0.0.1';
private $user = 'root';
private $password = '';
/* Creates database connection */
public function __construct() {
try {
$this->conn = new PDO($this->dsn, $this->user, $this->password);
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "";
die();
}
return $this->conn;
}
}
所以在这个类中,我创建一个数据库连接并返回连接(object?)
然后我有第二个类,著名的user类(实际上我没有使用autoload,但我知道):
include "database.php";
class User {
/* Properties */
private $conn;
/* Get database access */
public function __construct() {
$this->conn = new Database();
}
/* Login a user */
public function login() {
$stmt = $this->conn->prepare("SELECT username, usermail FROM user");
if($stmt->execute()) {
while($rows = $stmt->fetch()) {
$fetch[] = $rows;
}
return $fetch;
}
else {
return false;
}
}
}
这就是我的两门课。没什么大不了的,如你所见。现在,不要混淆函数名 login
-实际上,我只是尝试从数据库中选择一些用户名和用户邮件并显示它们。我试图通过以下方式实现这一目标:
$user = new User();
$list = $user->login();
foreach($list as $test) {
echo $test["username"];
}
问题来了。执行此代码时,会收到以下错误消息:
未捕获错误:调用未定义的方法数据库::prepare()
我不确定我是否真的明白是什么导致了这个错误。
当我更改以下内容时,代码运行良好:
改变 $conn
在database.php中改为public而不是private(我认为这不好。。。?但是当它是私有的时,我只能在数据库类内部执行查询,对吗?所以我应该把所有这些查询放在数据库类中吗?我认为这很糟糕,因为在一个大项目中,它会变得非常大……)
我要做的第二个改变是:改变 $this->conn->prepare
至 $this->conn->conn->prepare
在user.php文件中。在这里我真的不知道为什么。
我的意思是,在建筑中 user.php
我有一个 $this->conn = new Database()
由于新数据库将从db类返回connection对象,我真的不知道为什么必须有第二个 conn->
1条答案
按热度按时间ds97pgxw1#
你现在的课很没用。如果为pdo添加了一些额外的功能,那么创建一个数据库 Package 器是有意义的。但是考虑到它当前的代码,最好改用vanillapdo。
无论哪种方式,都可以从vanilla pdo或数据库类创建单个$db示例。
将其作为构造函数参数传递到每个需要数据库连接的类中
数据库.php:
用户.php
应用程序.php
输出:
查看我的(唯一正确的)pdo教程了解更多pdo细节。