首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对象属性不变

对象属性不变
EN

Stack Overflow用户
提问于 2018-09-21 07:56:17
回答 1查看 255关注 0票数 0

当我用面向对象编程时,我遇到了这个问题。在这个例子中,我的意思是创建一个有名字和体重的健身房成员,他在特定的时间内锻炼,然后减肥。不幸的是,重量对象在运动之后不会更新。

当我var_dump()健身房成员对象后,计算出的体重仍然是78,即使它符合减肥的标准。

以下是代码:

重量等级:

代码语言:javascript
复制
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);
  }


}

体育课成员:

代码语言:javascript
复制
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);

  }

}

新成员编制如下:

代码语言:javascript
复制
$gymMember = new GymMember('MTROBERT', new Weight(78));

$gymMember->workOutFor(Timelength::minutes(45));



var_dump($gymMember);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-21 08:44:09

您的“丢失”和“增益”方法正在返回一个新的Weight对象,但是您的GymMember没有这样做:

代码语言:javascript
复制
public function workoutFor(TimeLength $length)
  {

    // ...

    $this->weight->loose(2);

  }

因为lost (切切:“lost”,而不是“ lose ”)方法返回一个新对象,而不是修改自己,而且您没有将返回值分配给任何东西,所以它就是丢失了。

有两种可能的解决办法:

更改GymMember::workout(),这样它就可以执行如下操作:

代码语言:javascript
复制
$this->weight = $this->weight->loose(2);

或者更改Weight::lose(),这样它就可以做一些事情:

代码语言:javascript
复制
public function lose($kilograms)
{
   $this->weight -= $kilograms;
}

这两种方法都能解决你的问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52439130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档