PHP Duck Sample - Head First - Шаблоны проектирования - Глава первая - PullRequest
1 голос
/ 14 апреля 2011

Это первый вопрос, который я задаю многим другим.

Кто-то здесь может назвать меня сумасшедшим, потому что я следую за упомянутой книгой в названии вопроса, используя PHP-OO.

В первой главе авторы представляют простой проект под названием «SimUDuck», и, хотя я воспроизвел его на Java, мне было интересно воспроизвести его с помощью PHP.

В конце проект SimUDuck создает два (2) интерфейса (FlyBehavior и QuackBehavior), более пяти (5) классов, реализующих эти интерфейсы (например, FlyWithWings (), Quack () и т. Д.), Абстрактный класс, называемый Duck и три (3) или четыре (4) различных класса видов уток, расширяющих Duck (Mallard, HeadRedDuck, RubberDuck и т. д.), просто чтобы продемонстрировать, насколько важно программировать для интерфейса.

Чтобы имитировать среду основных методов Java, я создал класс PHP с именем MiniDuckSimulator, включая функцию '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 ]

2 голосов
/ 14 апреля 2011

Причина, по которой вы видите вывод 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
0 голосов
/ 28 марта 2018

Это потому, что когда у вас есть класс с тем же именем метода, PHP рассматривает его как конструктор. Это уже устарело в php 7 и скоро будет прекращено. Вы можете увидеть это в онлайн документации: http://php.net/manual/en/migration70.deprecated.php

0 голосов
/ 14 апреля 2011

Прокомментируйте эту строку:

echo 'Quack!<br />';

Видите ли вы еще кряки?Если это так, то в вашем коде есть echo / exit / die с этой строкой!

0 голосов
/ 14 апреля 2011

В вашей ситуации я бы лично предположил, что что-то упустил, когда говорил, что в коде достигается эхо без вызова этого метода.Я не вижу способа, чтобы это было возможно.

Повторно проанализируйте ваш код и ищите хитрый способ, которым ваше эхо 'Кряк! Кряк!'достигается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...