PHP项目数字新西兰元与eNZD

wen PHP项目 1

本文目录导读:

PHP项目数字新西兰元与eNZD

  1. 项目结构
  2. 核心代码实现

我来帮您创建一个PHP项目来处理数字新西兰元(NZD)和电子新西兰元(eNZD)的转换和管理。

项目结构

nzd-enzd-manager/
├── src/
│   ├── Currency/
│   │   ├── Money.php
│   │   ├── NZD.php
│   │   └── ENZD.php
│   ├── Exchange/
│   │   ├── ExchangeRate.php
│   │   └── ExchangeService.php
│   └── Wallet/
│       ├── Wallet.php
│       └── Transaction.php
├── tests/
├── composer.json
└── index.php

核心代码实现

Money基类

<?php
// src/Currency/Money.php
namespace App\Currency;
class Money
{
    protected float $amount;
    protected string $currency;
    public function __construct(float $amount, string $currency)
    {
        if ($amount < 0) {
            throw new \InvalidArgumentException("Amount cannot be negative");
        }
        $this->amount = round($amount, 2);
        $this->currency = $currency;
    }
    public function getAmount(): float
    {
        return $this->amount;
    }
    public function getCurrency(): string
    {
        return $this->currency;
    }
    public function add(Money $money): self
    {
        if ($money->getCurrency() !== $this->currency) {
            throw new \InvalidArgumentException("Currency mismatch");
        }
        return new static(
            $this->amount + $money->getAmount(),
            $this->currency
        );
    }
    public function subtract(Money $money): self
    {
        if ($money->getCurrency() !== $this->currency) {
            throw new \InvalidArgumentException("Currency mismatch");
        }
        if ($money->getAmount() > $this->amount) {
            throw new \InvalidArgumentException("Insufficient funds");
        }
        return new static(
            $this->amount - $money->getAmount(),
            $this->currency
        );
    }
    public function __toString(): string
    {
        return sprintf("%s %.2f", $this->currency, $this->amount);
    }
}

NZD和eNZD类

<?php
// src/Currency/NZD.php
namespace App\Currency;
class NZD extends Money
{
    public function __construct(float $amount)
    {
        parent::__construct($amount, 'NZD');
    }
}
<?php
// src/Currency/ENZD.php
namespace App\Currency;
class ENZD extends Money
{
    public function __construct(float $amount)
    {
        parent::__construct($amount, 'eNZD');
    }
}

汇率服务

<?php
// src/Exchange/ExchangeService.php
namespace App\Exchange;
use App\Currency\Money;
use App\Currency\NZD;
use App\Currency\ENZD;
class ExchangeService
{
    private ExchangeRate $rate;
    public function __construct(ExchangeRate $rate)
    {
        $this->rate = $rate;
    }
    public function convertNZDToENZD(NZD $nzd): ENZD
    {
        $amount = $nzd->getAmount() * $this->rate->getNZDToENZDRate();
        return new ENZD($amount);
    }
    public function convertENZDToNZD(ENZD $enzd): NZD
    {
        $amount = $enzd->getAmount() / $this->rate->getNZDToENZDRate();
        return new NZD($amount);
    }
}
<?php
// src/Exchange/ExchangeRate.php
namespace App\Exchange;
class ExchangeRate
{
    private float $nzdToEnzdRate;
    private float $enZdToNzdRate;
    public function __construct(float $nzdToEnzdRate = 1.0)
    {
        $this->nzdToEnzdRate = $nzdToEnzdRate;
        $this->enZdToNzdRate = 1 / $nzdToEnzdRate;
    }
    public function getNZDToENZDRate(): float
    {
        return $this->nzdToEnzdRate;
    }
    public function getENZDToNZDRate(): float
    {
        return $this->enZdToNzdRate;
    }
    public function updateNZDToENZDRate(float $rate): void
    {
        $this->nzdToEnzdRate = $rate;
        $this->enZdToNzdRate = 1 / $rate;
    }
}

钱包系统

<?php
// src/Wallet/Wallet.php
namespace App\Wallet;
use App\Currency\Money;
use App\Currency\NZD;
use App\Currency\ENZD;
use App\Exchange\ExchangeService;
class Wallet
{
    private string $owner;
    private NZD $nzdBalance;
    private ENZD $enzdBalance;
    private ExchangeService $exchangeService;
    private array $transactions = [];
    public function __construct(
        string $owner,
        ExchangeService $exchangeService,
        float $initialNZD = 0,
        float $initialENZD = 0
    ) {
        $this->owner = $owner;
        $this->exchangeService = $exchangeService;
        $this->nzdBalance = new NZD($initialNZD);
        $this->enzdBalance = new ENZD($initialENZD);
    }
    public function depositNZD(float $amount): void
    {
        $deposit = new NZD($amount);
        $this->nzdBalance = $this->nzdBalance->add($deposit);
        $this->addTransaction(
            TransactionType::DEPOSIT,
            $deposit,
            "NZD deposit"
        );
    }
    public function depositENZD(float $amount): void
    {
        $deposit = new ENZD($amount);
        $this->enzdBalance = $this->enzdBalance->add($deposit);
        $this->addTransaction(
            TransactionType::DEPOSIT,
            $deposit,
            "eNZD deposit"
        );
    }
    public function convertNZDToENZD(float $amount): ?ENZD
    {
        if ($amount > $this->nzdBalance->getAmount()) {
            return null;
        }
        $nzdToConvert = new NZD($amount);
        $this->nzdBalance = $this->nzdBalance->subtract($nzdToConvert);
        $enzdReceived = $this->exchangeService->convertNZDToENZD($nzdToConvert);
        $this->enzdBalance = $this->enzdBalance->add($enzdReceived);
        $this->addTransaction(
            TransactionType::EXCHANGE,
            $nzdToConvert,
            "Converted NZD to eNZD"
        );
        return $enzdReceived;
    }
    public function convertENZDToNZD(float $amount): ?NZD
    {
        if ($amount > $this->enzdBalance->getAmount()) {
            return null;
        }
        $enzdToConvert = new ENZD($amount);
        $this->enzdBalance = $this->enzdBalance->subtract($enzdToConvert);
        $nzdReceived = $this->exchangeService->convertENZDToNZD($enzdToConvert);
        $this->nzdBalance = $this->nzdBalance->add($nzdReceived);
        $this->addTransaction(
            TransactionType::EXCHANGE,
            $enzdToConvert,
            "Converted eNZD to NZD"
        );
        return $nzdReceived;
    }
    public function getNzdBalance(): float
    {
        return $this->nzdBalance->getAmount();
    }
    public function getEnzdBalance(): float
    {
        return $this->enzdBalance->getAmount();
    }
    public function getTransactions(): array
    {
        return $this->transactions;
    }
    private function addTransaction(TransactionType $type, Money $amount, string $description): void
    {
        $this->transactions[] = new Transaction(
            new \DateTime(),
            $type,
            $amount,
            $this->owner,
            $description
        );
    }
}

交易记录类

<?php
// src/Wallet/Transaction.php
namespace App\Wallet;
use App\Currency\Money;
enum TransactionType: string
{
    case DEPOSIT = 'deposit';
    case WITHDRAWAL = 'withdrawal';
    case EXCHANGE = 'exchange';
    case TRANSFER = 'transfer';
}
class Transaction
{
    private \DateTime $timestamp;
    private TransactionType $type;
    private Money $amount;
    private string $owner;
    private string $description;
    public function __construct(
        \DateTime $timestamp,
        TransactionType $type,
        Money $amount,
        string $owner,
        string $description = ''
    ) {
        $this->timestamp = $timestamp;
        $this->type = $type;
        $this->amount = $amount;
        $this->owner = $owner;
        $this->description = $description;
    }
    public function getTimestamp(): \DateTime
    {
        return $this->timestamp;
    }
    public function getType(): TransactionType
    {
        return $this->type;
    }
    public function getAmount(): Money
    {
        return $this->amount;
    }
    public function getOwner(): string
    {
        return $this->owner;
    }
    public function getDescription(): string
    {
        return $this->description;
    }
}

使用示例

<?php
// index.php
require_once 'vendor/autoload.php';
use App\Currency\NZD;
use App\Currency\ENZD;
use App\Exchange\ExchangeRate;
use App\Exchange\ExchangeService;
use App\Wallet\Wallet;
// 创建汇率服务(1 NZD = 1 eNZD)
$exchangeRate = new ExchangeRate(1.0);
$exchangeService = new ExchangeService($exchangeRate);
// 创建钱包
$wallet = new Wallet(
    'John Doe',
    $exchangeService,
    1000,  // 初始NZD余额
    500    // 初始eNZD余额
);
echo "初始余额:\n";
echo "NZD: " . $wallet->getNzdBalance() . "\n";
echo "eNZD: " . $wallet->getEnzdBalance() . "\n\n";
// 存入NZD
$wallet->depositNZD(500);
echo "存入500 NZD后:\n";
echo "NZD: " . $wallet->getNzdBalance() . "\n\n";
// 兑换NZD到eNZD
$converted = $wallet->convertNZDToENZD(300);
if ($converted) {
    echo "兑换300 NZD到eNZD:\n";
    echo "NZD: " . $wallet->getNzdBalance() . "\n";
    echo "eNZD: " . $wallet->getEnzdBalance() . "\n\n";
}
// 查看交易记录
echo "交易记录:\n";
foreach ($wallet->getTransactions() as $transaction) {
    echo sprintf(
        "[%s] %s: %s - %s\n",
        $transaction->getTimestamp()->format('Y-m-d H:i:s'),
        $transaction->getType()->value,
        $transaction->getAmount(),
        $transaction->getDescription()
    );
}

composer.json

{
    "name": "nzd-enzd/manager",
    "description": "Digital NZD and eNZD Currency Management System",
    "type": "project",
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    },
    "require": {
        "php": ">=8.1"
    },
    "scripts": {
        "test": "phpunit"
    }
}

这个PHP项目提供了完整的新西兰元和电子新西兰元管理功能,包括:

  • 货币创建和操作
  • 汇率转换
  • 钱包管理
  • 交易记录
  • 余额查询

您可以根据实际需求扩展更多功能,如添加数据库支持、REST API接口等。

抱歉,评论功能暂时关闭!