对象属性不变

时间:2018-09-21 07:56:18

标签: php static

使用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}}

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;
}

其中任何一种都可以解决您的问题。