我的数据库类中有一个 PDO 连接,最近我一直使用它作为其他类的扩展,即class Users extends Database
这使我能够始终保持数据库连接,而无需在我的 Users 类中拥有函数。
然而,有人指出我不应该这样做,因为这是一种不好的做法,为什么这是不好的做法呢?如何在不扩展的情况下连接到用户类中的数据库类?
目前我可以调用我的数据库viewall()
函数我试图把它放在一个__construct()
函数但是它坚持有参数
我已经尝试了下面的代码,但是我收到如下错误消息:
Fatal error: Call to undefined method Database::prepare() in E:\xampp\htdocs\attendance\class.Register.php on line 13
关于如何调用我的数据库有什么想法吗?
这是我的代码:
类.Connect.php
<?php
// Database connection PDO
class Database {
public function __construct() {
// Connection information
$host = 'localhost';
$dbname = 'attendance';
$user = 'root';
$pass = '';
// Attempt DB connection
try
{
$this->pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//echo 'Successfully connected to the database!';
}
catch(PDOException $e)
{
echo $e->getMessage();
}
}
public function __destruct()
{
// Disconnect from DB
$this->pdo = null;
//echo 'Successfully disconnected from the database!';
}
}
?>
类.Register.php
<?php
require 'class.Connect.php';
class Register {
public function viewall() {
$pdo = new Database();
$stmt = $pdo->prepare('SELECT * FROM users');
$stmt->execute();
$stmt->fetch();
}
}
$run = new Register();
$run->viewall();
?>
简单的经验法则:如果一个类extends
另一个,然后是那个班级is那个父类(仅稍微改变或扩展)。您可以传递这个子类而不是父类。例子:
class Foo { }
class Bar extends Foo { }
function baz(Foo $foo) { }
baz(new Bar);
这有效,baz()
期望一个Foo
但也接受Bar
, 因为Bar
is a Foo
.
Now, is your Users
a Database
?不。您的用户不是数据库。您的用户use一个数据库。如果有的话,你应该使用作品:
class User {
protected $database;
public function __construct(Database $database) {
$this->database = $database;
}
}
一个班级应该be它的职责是什么are。用户管理类的职责是管理用户数据。其中一部分可能涉及与数据库对话,但这并不意味着用户管理类is一个数据库。如果User extends Database
,这意味着它可以做所有事情Database
类可以做(以及更多)。这意味着您可以使用User
无处不在的阶级代替 the Database
类,这没有任何意义。将职责分开。
现在,这是否是正确的结构仍然存在争议,但它正朝着正确的方向发展。但你可能真的想拥有一个User
类,代表one user。然后你就有了一个UserManager
or UserORM
or UserStorage
或任何与检索和存储有关的内容User
数据库中的对象。这堂课依次uses a Database
就是这样做。这使得职责清晰且分离。这User
类代表用户数据,Database
类与数据库交互,UserORM/Manager/whatever
中间两人进行谈判。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)