5

関数の辞書が欲しい。このディクショナリを使用すると、関数名と引数の配列を受け取り、その関数を実行して、何かが返された場合に返される値を返すハンドラを作成できます。名前が既存の関数に対応しない場合、ハンドラーはエラーをスローします。

Javascript を実装するのは非常に簡単です。

var actions = {
  doSomething: function(){ /* ... */ },
  doAnotherThing: function() { /* ... */ }
};

function runAction (name, args) {
  if(typeof actions[name] !== "function") throw "Unrecognized function.";
  return actions[name].apply(null, args);
}

しかし、関数は実際には PHP のファースト クラス オブジェクトではないため、これを簡単に行う方法がわかりません。PHPでこれを行うための合理的に簡単な方法はありますか?

4

6 に答える 6

3

おっしゃっている意味がよくわかりません。
関数の配列が必要な場合は、次のようにします。

$actions = array(
'doSomething'=>function(){},
'doSomething2'=>function(){}
);

で関数を実行することができます$actions['doSomething']();

もちろん、引数を持つことができます:

$actions = array(
'doSomething'=>function($arg1){}
);


$actions['doSomething']('value1');
于 2012-06-18T12:11:17.160 に答える
3
$actions = array(
    'doSomething'     => 'foobar',
    'doAnotherThing'  => array($obj, 'method'),
    'doSomethingElse' => function ($arg) { ... },
    ...
);

if (!is_callable($actions[$name])) {
    throw new Tantrum;
}

echo call_user_func_array($actions[$name], array($param1, $param2));

ディクショナリは、許可されている任意のcallableタイプで構成できます。

于 2012-06-18T12:13:56.760 に答える
2

そのためにPHPを使用できます__call()

class Dictionary {
   static protected $actions = NULL;

   function __call($action, $args)
   {
       if (!isset(self::$actions))
           self::$actions = array(
            'foo'=>function(){ /* ... */ },
            'bar'=>function(){ /* ... */ }
           );

       if (array_key_exists($action, self::$actions))
          return call_user_func_array(self::$actions[$action], $args);
       // throw Exception
   }
}

// Allows for:
$dict = new Dictionary();
$dict->foo(1,2,3);

静的呼び出しの場合、__callStatic()使用できます (PHP5.3 以降)。

于 2012-06-18T12:13:47.230 に答える
1
// >= PHP 5.3.0
$arrActions=array(
    "doSomething"=>function(){ /* ... */ },
    "doAnotherThing"=>function(){ /* ... */ }
);
$arrActions["doSomething"]();
// http://www.php.net/manual/en/functions.anonymous.php


// < PHP 5.3.0
class Actions{
    private function __construct(){
    }

    public static function doSomething(){
    }

    public static function doAnotherThing(){
    }
}
Actions::doSomething();
于 2012-06-18T12:14:56.157 に答える
1

これをオブジェクト コンテキストで使用する場合は、関数/メソッド ディクショナリを作成する必要はありません。

マジック メソッドを使用すると、存在しないメソッドでエラーを発生させることができます__call()

class MyObject {

    function __call($name, $params) {
        throw new Exception('Calling object method '.__CLASS__.'::'.$name.' that is not implemented');
    }

    function __callStatic($name, $params) { // as of PHP 5.3. <
        throw new Exception('Calling object static method '.__CLASS__.'::'.$name.' that is not implemented');
    }
}

次に、他のすべてのクラスがあなたのクラスを拡張する必要がありMyObjectます...

http://php.net/__call

于 2012-06-18T12:25:46.327 に答える
0

http://php.net/manual/en/function.call-user-func.php

call_user_func名前から文字列として関数を実行し、パラメーターを渡すことができますが、この方法で実行することのパフォーマンスへの影響はわかりません。

于 2012-06-18T12:12:01.783 に答える