Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP鸭子示例-头部优先-设计模式-第一章_Php_Design Patterns_Interface - Fatal编程技术网

PHP鸭子示例-头部优先-设计模式-第一章

PHP鸭子示例-头部优先-设计模式-第一章,php,design-patterns,interface,Php,Design Patterns,Interface,这是我向其他许多人提出的第一个问题 这里有人可能会说我疯了,因为我正在使用PHP-OO关注问题标题中提到的那本书 在第一章中,作者介绍了一个名为“SimUDuck”的简单项目,尽管我在Java中复制了相同的项目,但我想知道如何使用PHP复制相同的项目 最后,SimUDuck的项目创建了两(2)个接口(FlyBehavior和QuackBehavior)、五(5)个以上实现这些接口的类(例如FlyWithWings()、Quack()等)、一个名为Duck的抽象类和三(3)或四(4)个扩展Duck

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

这里有人可能会说我疯了,因为我正在使用PHP-OO关注问题标题中提到的那本书

在第一章中,作者介绍了一个名为“SimUDuck”的简单项目,尽管我在Java中复制了相同的项目,但我想知道如何使用PHP复制相同的项目

最后,SimUDuck的项目创建了两(2)个接口(FlyBehavior和QuackBehavior)、五(5)个以上实现这些接口的类(例如FlyWithWings()、Quack()等)、一个名为Duck的抽象类和三(3)或四(4)个扩展Duck的不同鸭子物种类(Mallard、HeaderDuck、RubberDuck等),只是为了说明为接口编程是多么重要

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

有趣的问题是,如果不调用任何QuackBehavior::quack()实现的方法,echo'quack!嘎嘎出现。读过这本书的人都知道我在说什么

注意:以下是脚本的特定部分:






提前谢谢


LucDaher。

在您的情况下,我个人认为,当我说代码中的回音在未调用该方法的情况下到达时,我忽略了一些东西。我看不出这有什么可能


重新分析你的代码,并寻找一个鬼鬼祟祟的方式,你的回声'嘎嘎!嘎嘎正在联系。

您看到的原因
嘎嘎
输出的原因如下:

class Quack implements QuackBehavior {

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

可能更好的方法 评论这行:

echo 'Quack!<br />';
echo'嘎嘎

你看到更多的江湖医生了吗?如果是这样的话,那么代码中有一个echo/exit/die字符串

>P>这是因为当您拥有与方法同名的类时,PHP将其视为构造函数。这在PHP7中已经被弃用,并且很快将停止使用。你可以在在线文档中看到:

我的眼睛因为读了这篇文章而受伤了。我会尽量简短,但对于那些有兴趣帮助我的人来说,我会错过一些重要的信息。一个双重的“庸医”是毫无帮助的。它可以是两次调用的同一个方法,也可以是一个方法和类父级的方法。我会添加一些文字,如“嘎嘎橡胶”和“嘎嘎绿头鸭”等。这样更好吗????现在,关于“代码片段”,这是不可能的,因为它大约有10个不同的文件。我要做的就是把这些文件放在某个地方。我们的一个贝娄同伴(绰号叫梅塞克)回答了这个问题。问题是Quack类的方法是Quack(),因为PHP会将任何与类具有相同名称的方法视为类构造函数,所以当我调用“$mallard=new Quack()”时,将执行Quack()方法内容。我所做的很简单。。。将类名更改为NormalClass,就是这样。首先,感谢您的快速回复。虽然可能不够,但下面是“函数main()”的内容:$mallard=newmallard()$绿头鸭->性能()//没什么了。首先,上面的评论要求你把问题分解,而不是缩小。它太难读了。其次,人们知道鸭子在出生或飞行时会嘎嘎作响。我开玩笑。但说真的,必须有一些东西调用包含“echo”语句的方法。它不会自称。有些东西必须被忽略。我希望这个问题现在读起来更好。如果您已经阅读了这本书并使用Java测试了相同的示例(我相信您已经测试过),那么您唯一要做的就是用PHP替换Java名称空间(例如“System.out.println”,void)和声明,仅此而已。(当然,如果你有时间的话。)我还没有读过这本书。我的回答是建议用批判性思维来解决你的问题。遇到问题-->承担您的错误-->查找并修复错误。我希望我能帮你更多。“遇到问题-->”我试过了!!!“假设你犯了错误-->”我从昨天开始假设,但我没有找到解决方案,这就是我问这个问题的原因之一。“发现并修复错误”如果我没有用尽我脑海中所有的可能性,我也没有问这个问题,也没有在成员们的脑海中带来这么多的疑问。关于回声错误,我已经解释了原因。因为我是巴西人,在葡萄牙语中我们说‘Estou voando!’在字符串中不使用单引号,粘贴后,我将字符串翻译为英语。不要为第二个“庸医”操心。我编辑了字符串内容,只复制了一个“嘎嘎”(这对我来说已经太嘎嘎了!!!!:)。关于你提到的实际代码,我粘贴的代码就是实际代码。如果你不阅读答案,我帮不了你。你看到一个庸医的原因
是因为您有一个函数
quack()
quack
类同名,php自动将其视为构造函数。我添加了更多的编辑,可能会帮助您了解如何以一种可能更好的方式完成此操作…抱歉。。。我现在看到了,我没有看到你在横线后给出的答案,你是绝对正确的。非常感谢你。我忘记了PHP会将任何与类同名的方法视为类构造函数。我所做的是将类Quack重命名为NormalQuack,整个脚本运行良好。再次感谢你。我认为这不是一个更好的方式,因为他在书中谈到了“头部优先-设计模式”,在书中,这个例子是关于不要在鸭子类中实施庸医和飞行,因为例如,橡胶鸭子不能飞。他们建议为此创建接口和类
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();
class Quack implements QuackBehavior {

    public function quack() {
        echo 'Quack!<br />';
    }
}
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
echo 'Quack!<br />';