PHP Duck示例-从头开始-设计模式-第一章

|| 这是我问许多其他人的第一个问题。 这里有人可能会令我发疯,因为我正在使用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()实现的方法,就会显示回显“ 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。     
已邀请:
之所以看到“ 7”输出是因为:
class Quack implements QuackBehavior {

    public function quack() {
        echo \'Quack!<br />\';
    }
}
这是您的问题:如果仅运行
new Quack();
,则php将自动将
quack()
方法作为构造函数执行,因为它与您的类同名。 -我看到您在问题中引用了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
    
在您的情况下,我个人认为在未调用该方法的情况下在代码中已达到回显时,我已经忽略了某些内容。我看不到有这种可能的方法。 重新分析您的代码,并寻找一种偷偷摸摸的方式来达到您的回声'Quack!quack!\'。     
评论这一行:
echo \'Quack!<br />\';
你看到更多嘎嘎吗?如果是这样,那么在您的代码中有一个包含此字符串的echo / exit / die!     
这是因为当您拥有与方法相同名称的类时,PHP会将其视为构造函数。这已在php 7中弃用,很快将停产。您可以在在线文档中看到它:http://php.net/manual/en/migration70.deprecated.php     

要回复问题请先登录注册