简单策略模式 returns 不需要的回显输出

Simple strategy pattern returns unwanted echo output

当我 运行 脚本

<?php

interface IBrakeBehaviour {
    public function brake();
}

class Brake implements IBrakeBehaviour {
    public function brake() {
        echo "Simple Brake applied.";
    }
}

class BrakeWithABS implements IBrakeBehaviour {
    public function brake() {
        echo "Brake with ABS applied.";
    }
}

class Car {
    private $_brakeBehavior;

    public function __construct(IBrakeBehaviour $brakeBehavior)
    {
        $this->_brakeBehavior = $brakeBehavior;
    }

    public function brake() {
        $this->_brakeBehavior->brake();
    }
}

$bmw = new Car(new Brake());
$audi = new Car(new BrakeWithABS());

它会自动回显 "Simple Brake applied." 但是当我执行

时应该会出现该消息
$bmw->brake(); or $audi->brake();

而不是之前。

有人知道我做错了什么吗?提前谢谢了。

赫伯特

在 PHP 中,您可以同时使用 __construct,并且如果您愿意,可以将构造函数命名为与 class 相同的名称(不能 100% 确定这是否适用于所有版本).
所以你遇到的问题是你的 Brake class 实现了一个构造函数而不是你认为它实现的方法 (brake)。

现在,人们可能会认为 Brake()brake() 之间会有区别,但没有。在 php 中,method/function 名称不区分大小写,因此它们是相同的...

如何绕过这个问题?
如果将构造函数实现为 __construct before 实现 brake 函数,它应该可以工作,即:

class Brake {
  public function __construct() {} // First
  public function Brake() {}       // Then this
}

否则您可能会遇到 Redefining already defined constructor 错误。