PHP: прелести динамического языка. Шаблоны проектирования - PullRequest
0 голосов
/ 05 марта 2011

У меня есть следующая картина. Или лучше ИДЕЯ! Существуют классы "unit", унаследованные от BaseUnit, и классы "users", унаследованные от BaseUser. Потомки и потомки пользователей очень похожи по структуре.

Я хочу применить функцию "панели инструментов" для пользователей, работающих с единицами

Это может выглядеть как

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 ]

2 голосов
/ 05 марта 2011

Не используйте eval, если нет лучшего решения.В вашем случае оказывается, что является лучшим решением - call_user_func и call_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 голос
/ 05 марта 2011

Я собирался указать вам в том же направлении, куда вас указал Касабланка, но он побил меня этим :).

Тем не менее, вот небольшой пример, который вам может пригодиться:

<?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');
?>

Удачи,
Алинь

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