使用OOP时,我遇到了这个问题。在此示例中,我的目的是创建一个具有名称和体重的体育馆成员,并在特定时间锻炼然后减轻体重。幸运的是,重量对象在锻炼后不会更新。
当我class Weight
{
protected $weight;
public function __construct($weight)
{
$this->weight = $weight;
}
public function gain($kilograms)
{
return new static($this->weight + $kilograms);
}
public function loose($kilograms)
{
return new static($this->weight - $kilograms);
}
}
锻炼身体后,即使符合减肥标准,体重仍为78。
代码如下:
体重等级:
class GymMember
{
protected $name;
protected $weight;
public function __construct($name, Weight $weight)
{
$this->name = $name;
$this->weight = $weight;
}
public function workoutFor(TimeLength $length)
{
if(!$length->inSeconds() > (40 * 60 ))
{
return 'Keep up the good work!';
}
$this->weight->loose(2);
}
}
健身会员班:
$gymMember = new GymMember('MTROBERT', new Weight(78));
$gymMember->workOutFor(Timelength::minutes(45));
var_dump($gymMember);
新成员正在解决:
{{1}}
答案 0 :(得分:2)
您的“ lose”和“ gain”方法将返回一个新的Weight
对象,但是您的GymMember
对此没有做任何事情:
public function workoutFor(TimeLength $length)
{
// ...
$this->weight->loose(2);
}
由于Lost方法(切向:“ loose ”,而不是“ loose ”)返回一个新对象,而不是对其自身进行修改,因此您没有分配该返回值对任何东西来说,简直就是迷路。
两种可能的解决方案:
更改GymMember::workout()
,使其执行以下操作:
$this->weight = $this->weight->loose(2);
或更改Weight::lose()
使其起作用:
public function lose($kilograms)
{
$this->weight -= $kilograms;
}
其中任何一种都可以解决您的问题。