我认为在理解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; } }
因此,在此类中,我正在创建数据库连接,然后返回连接(对象?)
然后,我有第二个类,著名的User类(实际上,我没有使用自动加载功能,但是我知道):
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-实际上,我只是尝试从数据库中选择一些用户名和用户邮件并显示它们。我尝试通过以下方法实现这一目标:
login
$user = new User(); $list = $user->login(); foreach($list as $test) { echo $test["username"]; }
问题来了。执行此代码时,出现以下错误消息:
未捕获的错误:调用未定义的方法Database :: prepare()
而且我不确定我是否真的了解导致此错误的原因。
当我更改以下内容时,代码运行良好:
将$conndatabase.php 更改为public,而不是private(我认为那很糟糕…?但是当它为private时,我只能在Database类内部执行查询,对吗?所以我应该将所有这些查询都放入Database类吗?我认为这很糟糕,因为在一个大型项目中,它将变得非常大。
$conn
而我要做的第二个更改是:在user.php文件中更改$this->conn->prepare为$this->conn->conn->prepare。在这里,我真的不知道为什么。
$this->conn->prepare
$this->conn->conn->prepare
我的意思是,在构造函数中user.php我有一个$this->conn = new Database()和因为新的数据库将返回我从DB类连接对象,我真的不知道为什么非得是第二conn->
user.php
$this->conn = new Database()
conn->
database.php:
<?php $host = '127.0.0.1'; $db = 'test'; $user = 'root'; $pass = ''; $charset = 'utf8'; $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; $opt = [ \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC, \PDO::ATTR_EMULATE_PREPARES => false, ]; $pdo = new \PDO($dsn, $user, $pass, $opt);
<?php class User { /* Properties */ private $conn; /* Get database access */ public function __construct(\PDO $pdo) { $this->conn = $pdo; } /* List all users */ public function getUsers() { return $this->conn->query("SELECT username, usermail FROM user")->fetchAll(); } }
app.php
include 'database.php'; $user = new User($pdo); $list = $user->getUsers(); foreach($list as $test) { echo $test["username"],"\n"; }
输出:
username_foo username_bar username_baz