2014-02-22 65 views
0

我是PHP和Design Patterns中的一个开始。我一直在研究令人惊叹的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(); 


?> 

当我跑我得到的错误 “未定义变量:quackBehavior” 一致 “$本 - > $ quackBehavior->嘎嘎();”里面的“抽象类鸭”。

回答

4

错误说,这一切

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

+0

对此有解释吗?为什么我不需要这个? – DanielTheRocketMan

+0

谢谢!它解决了执行问题,但现在有两个与Quack类相关的“Quack”。你知道原因吗? – DanielTheRocketMan

+1

@DanielTheRocketMan解释是[变量变量](http://www.php.net/manual/en/language.variables.variable.php) –

2

取下$this->$quackBehavior->quack();$$this->$flyBehavior->fly();$quackBehavior$flyBehavior

盈方应该是这样的....

$this->quackBehavior->quack(); //<--- Under your performQuack() 

and

$this->flyBehavior->fly(); //<--- Under your performFly() 
+0

它解决了执行问题,但现在有两个与Quack类有关的“Quack”出现。你知道原因吗? – DanielTheRocketMan