The Value Object Pattern By PHP

本文通过一个PHP类设计实例展示了不恰当的设计可能导致的问题。案例中,`BadDollar`类的`add`方法修改了对象状态,导致不同对象间的状态意外共享。此问题突显了在设计类和方法时需考虑其副作用的重要性。

class BadDollar {
    protected $amount;
    public function __construct($amount=0) {
        $this->amount = (float)$amount;
    }
    public function getAmount() {
        return $this->amount;
    }
    public function add($dollar) {
        $this->amount += $dollar->getAmount();
    }
}


class Work {
    protected $salary;
    public function __construct() {
        $this->salary = new BadDollar(200);
    }
    public function payDay() {
        return $this->salary;
    }
}


class Person {
    public $wallet;
}


function testBadDollarWorking() {
    $job = new Work;
    $p1 = new Person;
    $p2 = new Person;
    $p1->wallet = $job->payDay();
    $this->assertEqual(200, $p1->wallet->getAmount());
    $p2->wallet = $job->payDay();
    $this->assertEqual(200, $p2->wallet->getAmount());
    $p1->wallet->add($job->payDay());
    $this->assertEqual(400, $p1->wallet->getAmount());
    //this is bad — actually 400
    $this->assertEqual(200, $p2->wallet->getAmount());
    //this is really bad — actually 400
    $this->assertEqual(200, $job->payDay()->getAmount());
}

转载于:https://www.cnblogs.com/candybox/articles/1803347.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值