簡體   English   中英

策略模式無效:我在做什么錯?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM