我正在尝试在PHP中了解有关OOP的更多信息,因此我设置了一个简单的情况。
我有一个MySQL数据库,其中包含一个包含钱包的表。然后我做了以下课程:
class WalletConnection {
private $db;
private $user_id;
private $wallets;
public function __construct ($user_id) {
$this->user_id = $user_id;
$this->db = new PDO('mysql:host=localhost;dbname=ws;charset=utf8', 'dbuser', '***');
$this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
}
public function loadWallets () {
$sql = $this->db->prepare('SELECT id, CurrencyCode, Balance FROM wallets WHERE UserID = :UserID');
$sql->execute([':UserID' => $this->user_id]);
$this->wallets = $sql->fetchAll(PDO::FETCH_ASSOC);
}
public function getWallet ($num) {
// do something like: new Wallet($this->wallets[$num])
}
}
然后我像这样创建钱包连接:
$wallets = new WalletConnection(40); // 40 = UserID of wallet owner
$wallets->loadWallets();
现在我想创建一个子类钱包来处理各个钱包。
class Wallet extends WalletConnection {
private $id, $balance, $currency_code;
public function __construct($data) {
$this->id = $data['id'];
$this->balance = $data['Balance'];
$this->currency_code = $data['CurrencyCode'];
}
public function getBalance() {
}
}
要了解有关OOP的更多信息,我想构建它:
$wallet = $wallets->getWallet(0); // This will now contain the id, CurrencyCode, Balance of the first wallet of the parent's $wallets.
所以我想我需要在WalletConnection类中添加一个getWallet()函数并从那里调用“new Wallet”。
然后在我想要做的客户端代码中:
$wallet->getBalance()
目前我不知道我是否以正确的方式这样做,如果我是,我需要知道接下来要做什么,以确保例如getBalance()函数可以使用父的$ db连接
答案 0 :(得分:1)
如果您想了解有关OOP的更多信息,请了解它的原理。 http://codebetter.com/raymondlewallen/2005/07/19/4-major-principles-of-object-oriented-programming/
您应该深入了解封装主体,因为您在此处违反了此规则,因为您的数据库与您的电子钱包之间存在依赖关系。
更好的做法是将钱包作为模型,以及负责与之相关的功能的服务(例如getWalletById)。
您需要一个知道如何从数据库中获取信息的映射器(通常是数组)并将其映射到钱包模型。
此外,您还希望使用可以连接到数据库的适配器,而不仅仅是使用钱包。
请记住,扩展并不总是解决方案,有时你应该使用组合而不是继承。
例如,该服务包含一个映射器,映射器包含适配器。
总结一下,尝试这样的事情:
最后,您应该只有一行代码:
$wallet = $walletService->getWalletById($id);
你应该能够通过公开或吸气来使用它的属性:
$balance = $wallet->balace;
或
$balance = $wallat->getBalance();