PHP Duck Sample - Head First - 设计模式 - 第一章

时间:2011-04-14 14:13:08

标签: php design-patterns interface

这是我要求其他许多人提出的第一个问题。

这里的某个人可能会叫我发疯,因为我正在使用PHP-OO关注问题标题中提到的那本书。

在第一章中,作者介绍了一个名为“SimUDuck”的简单项目,虽然我在Java中重现了相同的内容,但我想知道使用PHP重现相同的内容。

最后,SimUDuck的项目创建了两个(2)接口(FlyBehavior和QuackBehavior),超过五(5)个类实现了这些接口(例如FlyWithWings(),Quack()等),一个名为Duck的抽象类和三(3)或四(4)种不同的鸭类物种类延伸鸭(Mallard,HeadRedDuck,RubberDuck等),只是为了证明对接口编程有多重要。

为了模拟Java主方法环境,我创建了一个名为MiniDuckSimulator的PHP类,包括函数'public static function main()',在同一个脚本中我添加了“MiniDuckSimulator :: main();” 。该脚本可以正常运行。

有趣的问题是,如果没有调用任何QuackBehavior :: quack()实现的方法,回显'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();

提前致谢。

LucDaher。

4 个答案:

答案 0 :(得分:2)

您看到Quack!<br />输出的原因是:

class Quack implements QuackBehavior {

    public function quack() {
        echo 'Quack!<br />';
    }
}

这是你的问题:如果只是运行new Quack();quack()方法会被php作为构造函数自动执行,因为它与你的类名相同。 - 我看到你在你的问题中引用了Java,所以这不应该是你的外国概念。

new Quack(); // => Quack!<br />

一种可能更好的方法

<?php

interface CanFly {
  public function fly();
}

interface CanQuack {
  public function quack();
}

abstract class Duck implements CanFly, CanQuack {

  protected $color = "DEFAULT"

  public function fly(){
    echo "I'm flying with my {$this->color} wings\n";
  }

  public function quack(){
    echo "I'm quacking\n";
  }

  public function swim(){
    echo "I'm swimming\n";
  }
}

class Mallard extends Duck {

  public function __construct(){
    $this->color = "green";
  }

  public function quack(){
    echo "My quack sounds more like a honk\n";
  }
}

$m = new Mallard();
$m->fly();
$m->quack();
$m->swim();

?>

输出

I'm flying with my green wings
My quack sounds more like a honk
I'm swimming

答案 1 :(得分:0)

在你的情况下,我个人认为,当你说代码中没有调用该方法时,就会忽略某些东西。我看不出这种可行的方式。

重新分析你的代码并寻找一种你的回声'嘎嘎!嘎嘎!'的偷偷摸摸的方式!正在接触。

答案 2 :(得分:0)

评论此行:

echo 'Quack!<br />';

你看到更多嘎嘎声吗?如果是这样,那么你的代码中就会有一个带有这个字符串的echo / exit / die!

答案 3 :(得分:0)

这是因为当你拥有与方法名称相同的类时,PHP会将其视为构造函数。这已经在php 7中弃用了,很快就会停止使用。您可以在在线文档中看到它:http://php.net/manual/en/migration70.deprecated.php