这是我要求其他许多人提出的第一个问题。
这里的某个人可能会叫我发疯,因为我正在使用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。
答案 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