本文目录导读:

我来帮您创建一个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接口等。