[英]Strategy pattern not working: What am I doing wrong?
我是PHP和設計模式的一個開始。 我一直在研究驚人的Head First Design模式。 因此,我一直在嘗試將原始語言翻譯成PHP。 但是,我必須做的事情非常錯誤,因為它不起作用。 你能幫助我嗎?
<?php
interface FlyBehavior{
public function fly();
}
class FlyWithWings implements FlyBehavior{
public function fly(){
echo "I am flying!";
}
}
class FlyNoWay implements FlyBehavior{
public function fly(){
echo "I cannot fly!";
}
}
interface QuackBehavior{
public function quack();
}
class Quack implements QuackBehavior{
public function quack(){
echo "Quack";
}
}
class MuteQuack implements QuackBehavior{
public function quack(){
echo "Silence";
}
}
class Squeak implements QuackBehavior{
public function quack(){
echo "Squeak";
}
}
abstract class Duck{
protected $quackBehavior;
protected $flyBehavior;
public function performQuack(){
$this->$quackBehavior->quack();
}
public function performFly(){
$this->$flyBehavior->fly();
}
abstract public function display();
public function swim(){
echo "All ducks float, even decoy";
}
}
class MallardDuck extends Duck{
public function __construct(){
$this->quackBehavior=new Quack();
$this->flyBehavior=new FlyWithWings();
}
public function display(){
echo "I am real Mallard duck!";
}
}
$mallard=new MallardDuck();
$mallard->performQuack();
$mallard->performFly();
?>
運行時,在“ $ this-> $ quackBehavior-> quack();”行中出現錯誤“未定義變量:quackBehavior”。 在“抽象類鴨子”里面。
錯誤說明了一切
public function performQuack(){
$this->$quackBehavior->quack();
}
public function performFly(){
$this->$flyBehavior->fly();
}
應該
public function performQuack(){
$this->quackBehavior->quack();
}
public function performFly(){
$this->flyBehavior->fly();
}
$this->quackBehaviory
引用您的類的一個屬性。
$quackBehaviory
表示它是一個函數范圍的變量。
因此,要訪問類屬性,您需要使用$this->quackBehaviory
從$this->$quackBehavior->quack();
刪除$
$this->$quackBehavior->quack();
和$this->$flyBehavior->fly();
即$quackBehavior
和$flyBehavior
應該是這樣的...
$this->quackBehavior->quack(); //<--- Under your performQuack()
和
$this->flyBehavior->fly(); //<--- Under your performFly()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.