本文目录导读:

我来帮您创建一个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接口等。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播