gpt4 book ai didi

php - 延长类(class)是好的做法吗?

转载 作者:可可西里 更新时间:2023-11-01 07:18:26 27 4
gpt4 key购买 nike

我的数据库类中有一个 PDO 连接,最近我一直在使用它作为其他类的扩展,即 class Users extends Database 这允许我始终保持数据库连接而不必我的用户类中的一个函数。

但是有人指出我不应该这样做,这是一种不好的做法,为什么这是不好的做法呢?以及如何在不扩展的情况下连接到我的用户类中的数据库类?

目前我在 viewall() 函数中调用了数据库 我试图将其放入 __construct() 函数中,但它坚持要有参数

我试过下面的代码,但是我得到如下错误信息:

fatal error :在第 13 行调用 E:\xampp\htdocs\attendance\class.Register.php 中未定义的方法 Database::prepare()

关于如何调用我的数据库有什么想法吗?

这是我的代码:

类.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();

?>

最佳答案

简单的经验法则:如果一个类扩展另一个类,那么那个类就是那个父类(只是稍微改变或扩展)。您可以传递这个子类而不是父类。示例:

class Foo { }

class Bar extends Foo { }

function baz(Foo $foo) { }

baz(new Bar);

这有效,baz() 需要一个 Foo 但也接受一个 Bar,因为 Bar 一个Foo

现在,您的用户 数据库?不,您的用户不是数据库。您的用户使用 数据库。如果有的话,你应该使用组合:

class User {

protected $database;

public function __construct(Database $database) {
$this->database = $database;
}

}

类应该其职责。用户管理类的职责是管理用户数据。其中一部分可能涉及与数据库对话,但这并不意味着用户管理类 是一个数据库。如果 User extends Database,这意味着它可以做 Database 类可以做的所有事情(甚至更多)。这意味着您可以在任何地方使用 User 类,而不是 Database 类,这没有任何意义。保持责任分离。

现在,这是否是正确的结构仍有争议,但它朝着正确的方向发展。但您可能真的想要一个 User 类,它代表一个用户。然后你有一个 UserManagerUserORMUserStorage 或其他任何东西,它与检索和存储 User 对象有关一个数据库。此类又使用 数据库 来执行此操作。这使责任明确和分离。 User类代表用户数据,Database类与数据库交互,中间的UserORM/Manager/whatever在两者之间进行协商。

关于php - 延长类(class)是好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18853199/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com