【发布时间】:2011-04-14 14:13:08
【问题描述】:
这是我向许多其他人提出的第一个问题。
这里有人可能会说我疯了,因为我正在使用 PHP-OO 关注问题标题中提到的书。
在第一章中,作者介绍了一个名为“SimUDuck”的简单项目,虽然我在 Java 中重现了相同的项目,但我想用 PHP 重现相同的项目。
最后,SimUDuck 的项目创建了两 (2) 个接口(FlyBehavior 和 QuackBehavior)、超过五 (5) 个实现这些接口的类(例如 FlyWithWings()、Quack() 等)、一个名为 Duck 的抽象类和三 (3) 或四 (4) 种不同的鸭子种类类扩展 Duck(Mallard、HeadRedDuck、RubberDuck 等),只是为了演示接口编程的重要性。
为了模拟 Java 主方法环境,我创建了一个名为 MiniDuckSimulator 的 PHP 类,包括函数“public static function main()”,并在同一个脚本中添加了“MiniDuckSimulator::main();” .该脚本可以正常工作。
有趣的问题是,在没有调用任何 QuackBehavior::quack() 实现的方法的情况下,echo 'Quack!quack!'出现。读过这本书的人都知道我在说什么。
注意:以下是脚本的特定部分:
interface FlyBehavior {
public function fly();
}
interface QuackBehavior {
public function quack();
}
include_once 'FlyBehavior.php';
class FlyWithWings implements FlyBehavior {
public function fly() {
echo 'I'm flying!<br />';
}
}
include_once 'QuackBehavior.php';
class Quack implements QuackBehavior {
public function quack() {
echo 'Quack!<br />';
}
}
abstract class Duck {
protected $flyBehavior;
protected $quackBehavior;
function __construct() {
}
public function performFly(){
$this->flyBehavior->fly();
}
public function performQuack(){
$this->quackBehavior->quack();
}
public function setFlyBehavior($flyBehavior){
$this->flyBehavior = $flyBehavior;
}
public function swim(){
echo "All the ducks float, including the decoy!<br />";
}
}
include_once 'Duck.php';
include_once 'FlyWithWings.php';
include_once 'Quack.php';
class Mallard extends Duck {
function __construct() {
$this->flyBehavior = new FlyWithWings();
$this->quackBehavior = new Quack();
}
}
class MiniDuckSimulator {
public static function main(){
$mallard = new Mallard();
$mallard->performFly();
}
}
MiniDuckSimulator::main();
提前致谢。
卢克达赫。
【问题讨论】:
-
看文字我的眼睛受伤了:-S
-
对不起。我会简短地说,但会错过一些有兴趣帮助我的人的重要信息。
-
双重“庸医”是没有用的。它可能是同一个方法被调用了两次,也可能是一个方法和父类的方法。我会添加一些文字,例如“quack-rubber”和“quack mallard”等。
-
更好吗???现在,关于“code sn-ps”是不可能的,因为它大约有 10 个不同的文件。我要做的是将这些文件附加到某个地方。
-
我们的一位同事(昵称 Macek)已经回答了这个问题。问题是 Quack 类有方法 quack(),并且由于 PHP 会将与类同名的任何方法视为类构造函数,所以当我调用“$mallard = new Quack()”时,quack()方法内容将被执行。我做的很简单……把类名改成NormalClass,就是这样。
标签: php design-patterns interface