PHP:父类和子类

时间:2017-01-22 13:06:30

标签: php mysql oop

我正在尝试在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连接

1 个答案:

答案 0 :(得分:1)

如果您想了解有关OOP的更多信息,请了解它的原理。 http://codebetter.com/raymondlewallen/2005/07/19/4-major-principles-of-object-oriented-programming/

您应该深入了解封装主体,因为您在此处违反了此规则,因为您的数据库与您的电子钱包之间存在依赖关系。

更好的做法是将钱包作为模型,以及负责与之相关的功能的服务(例如getWalletById)。

您需要一个知道如何从数据库中获取信息的映射器(通常是数组)并将其映射到钱包模型。

此外,您还希望使用可以连接到数据库的适配器,而不仅仅是使用钱包。

请记住,扩展并不总是解决方案,有时你应该使用组合而不是继承。

例如,该服务包含一个映射器,映射器包含适配器。

总结一下,尝试这样的事情:

  1. 创建钱包模型。创建钱包服务。创建一个钱包 映射器。创建一个PDO适配器。
  2. 使用PDO适配器获取原始SQL钱包数据
  3. 将数组映射到正确的钱包模型并通过映射器返回
  4. 通过服务退回电子钱包模型。
  5. 最后,您应该只有一行代码:

    $wallet = $walletService->getWalletById($id);
    

    你应该能够通过公开或吸气来使用它的属性:

    $balance = $wallet->balace;
    

    $balance = $wallat->getBalance();