2011-03-04 49 views
0

我有以下模式。或者更好的IDEA! 有從BaseUnit繼承的「單元」類和從BaseUser繼承的「用戶」類。後代單位和後代用戶在結構上非常相似。PHP:動態語言的美女。設計模式

我想申請一個「工具欄」功能,爲用戶提供單位

工作它可以像

class KickerUser extends BaseUser{ 
    public $toolbar = array('view()', 'kick("right_leg", "twice")') 
} 


class BaseUnit{ 
    public function view(); 

    public function kick($a, $b); 

    public function bite($c); 

    protected function applyToolbar($user){ 

    ///////////////HERE COMES THE TRICK//////// 
      foreach($user->toolbar as $t){ 
       $this->$t; 
      } 
    // should I use eval() for this 
    // to become something like: $this->bite('hard'); 
    // i'm interested in making the readable code 
    // and passing constant parameters 
    /////////////HOW TO WRTITE THIS CORRECTLY ? 
    } 
} 

這是做事情的好辦法嗎?

回答

2

除非沒有更好的解決方案,否則不要使用eval。在你的情況,原來更好的解決方案 - call_user_funccall_user_func_array。兩個函數之間的區別在於您是直接傳遞參數還是作爲數組傳遞參數。

舉例來說,如果你要調用$this->kick('right_leg', 'twice'),你可以把它寫成:

call_user_func(array($this, 'kick'), 'right_leg', 'twice'); 

或:

call_user_func_array(array($this, 'kick'), array('right_leg', 'twice')); 

你可以很容易地使這種動態:

call_user_func_array(array($this, $methodName), $parametersArray); 
1

我想指出你和卡薩布蘭卡指出你的方向一致,但他打敗了我: )。

然而,這裏就是你可能會發現有用的一個小例子:

<?php 
class MyClass{ 
    private $_name; 

    public function __construct($name){ 
     $this->_name = $name; 
    } 

    private function sayMyName($asker){ 
     echo 'My name is ', $this->_name, ', ', $asker, '!'; 
    } 

    public function askForName($asker){ 
     call_user_func(array($this, 'sayMyName'), $asker); 
    } 
} 

$obj = new MyClass('Paul'); 
$obj->askForName('Mr. Rogers'); 
?> 

祝你好運,
阿林