简单策略模式 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
错误。
当我 运行 脚本
<?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
错误。