我的数据库类中有一个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
关于如何调用数据库的任何想法?
这是我的代码:
class.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!';
}
}
?>
class.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
另一个类,则该类是该父类(仅稍作更改或扩展)。您可以传递此子类而不是父类。例:
class Foo { }
class Bar extends Foo { }
function baz(Foo $foo) { }
baz(new Bar);
这个工程,baz()
预计一Foo
也接受Bar
,因为Bar
是一个Foo
。
现在,是你Users
一个Database
?否。您的用户不是数据库。您的用户使用数据库。如果有的话,您应该使用composition:
class User {
protected $database;
public function __construct(Database $database) {
$this->database = $database;
}
}
一类应该是什么样的责任是。用户管理类的职责是管理用户数据。其中的一部分可能涉及与数据库对话,但这并不意味着用户管理类是数据库。如果为User extends Database
,则表示它可以执行Database
该类可以执行的所有操作(以及更多操作)。这意味着你可以使用User
随处可见的类来代替的Database
类,并且不作任何意义。将职责分开。
现在,这是否是正确的结构仍值得商,,但它朝着正确的方向发展。但是您可能真的想要一个User
代表一个用户的类。然后,您将拥有一个UserManager
or或UserORM
orUserStorage
或其他任何东西,它与User
在数据库中检索和存储对象有关。此类依次使用aDatabase
来做到这一点。这样可以使责任明确和分离。所述User
类表示用户数据,则Database
与数据库交互类,则UserORM/Manager/whatever
在这两者之间的中间谈判中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句