• 締切済み

call_user_funcやcall_user_func_arrayはどのような時に使うのでしょうか?

PHPのフレームワーク(Zend Fremeworkやsymfony)のコードをみていると、 call_user_func や call_user_func_array をたまに見かけますが、なぜ、 この関数を使用しているのでしょうか? call_user_func_array('test', array($a, $b)); の代わりに test($a, $b); とできないのでしょうか?

みんなの回答

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

実行する関数の名前を、処理内容に応じて動的に切り替えたいときに 使うのだと思います。例えば、 db_insert db_delete のような、データベース関連の関数があるとします。 insert処理の場合は $process = 'insert'; delete処理の場合は $process = 'delete'; のようにしておき、 $func = 'db_' . $process; とすれば、$funcに関数名をセットできます。 セットした関数名をcall_user_funcの第1引数として渡す、というやり方です。 以上、PHP初級者からでした。

sweepea
質問者

補足

ご回答ありがとうございます。 $func = 'db_' . $process; で関数名が $func にセットされたなら、 $func('table_name'); や、クラスのメソッドなら $this->$func('table_name'); で、実行できると思うのですが、 なぜ、call_user_func を使うのでしょうか? コーディング規約とかそういうものなのでしょうか? call_user_func を使用しなければ実現できないような処理、 もしくは、実現するのが大変困難になるような処理とは どういったものなのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • javaでcall_user_func_array

    こんにちは。 javaでphpのcall_user_func_arrayのようなことってできるのでしょうか? 教えてください。

  • Pythonでcall_user_funcを行う

    お世話になります。 最近Pythonの勉強を始めた初心者です。 GAE/Python2.5で、PHPで言うcall_user_funcを使う方法を探しております。 具体的に言いますと、関数名(メソッド名)を変数に入れて、それを呼び出す方法を探しています。 例えばPHPで言えば下記のようなコードです。 ---------------------- <?php // 呼び出すクラス class CTestClass {   // 呼び出すメソッド   function TestFunc()   {     echo 'Call <CTestClass::TestFunc()>';   } } // 変数にメソッド名を入れて呼び出す $func = 'TestFunc'; $obj = new CTestClass(); call_user_func( array( $obj, $func ) ); // print Call <CTestClass::TestFunc()> ---------------------- Pythonでは上記のような事は可能でしょうか? また、メソッドを呼び出すのと普通のグローバル関数を呼び出すのでやり方が違う場合はそちらも教えて頂けるとあり難いです。 以上、よろしくお願い致します。

  • エラーが起きた位置の特定

    例えば下記のようなコードで、この(↓)エラーが出たとします。 Warning: somefunc1(): The argument should be an array in /path/to/test.php on line 5 このエラーが、 A) 18行目→test_func1()→somefunc1() の経路で発生したエラーなのか、 B) 19行目→test_func2()→test_func1($arg1)→somefunc1() の経路なのか、 C) 19行目→test_func2()→test_func1($arg2)→somefunc1() の経路なのか、 それを効率よく判断する方法はありませんか? この位簡単なコードではデバッグも簡単なんですが、大規模なアプリケーションになってくると、どの時点で起きたエラーなのか(どの手順で呼び出された時なのか、ループの何回目なのか等)の判断ができなくなってきてしまいます。 ==== test.php ==== 01: <?php 02: 03: function test_func1($arg) 04: { 05:   somefunc1($arg); // PHP組み込み関数 06: } 07: 08: function test_func2($arg) 09: { 10:   $arg1 = somefunc2($arg); // PHP組み込み関数 11:   $arg2 = somefunc3($arg); // PHP組み込み関数 12:   test_func1($arg1); 13:   test_func1($arg2); 14: } 15: 16: $val = /* ...処理... */ ; 17: 18: test_func1($val); 19: test_func2($val); 20: 21: ?> よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPのフレームワーク

    PHPを勉強しようと思っているのですが フレームワークの違いが分からずに何を基準にしてよいかわかりません。 cakeとかSymfonyとかzendとかlaravelとか・・ 同じPHPだと思うのですが、基本的に何が違うのでしょう? またこれらは全く違うものなのでしょうか? それともちょっと違う程度で、ある程度似ているものなのでしょうか?

    • 締切済み
    • PHP
  • PHPのフレームワーク

    PHPのことはよく分かりませんが、いくつかのフレームワークがあります。 知らないながらもキーワードをあげると、Symfony,Smarty,Zendなど。 RubyではRubyOnRailsが圧倒的ですが、PHPの場合は、どれが有望あるいはどれがよいのでしょうか? 個人的趣味でお答えください。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • array_combine()について

    http://phpspot.net/php/man/php/function.array-combine.html こちらを参考に配列のまとめ方と取り出し方を模索中です。 $a = array('green', 'red', 'yellow'); $b = array('avocado', 'apple', 'banana'); $c = array_combine($a, $b); ↑こちらは、 foreach($c as $key => $value){ ~ } ↑このような感じでそれぞれ取り出せると思います。 ここまではいけました。 この状態で対象が3つ以上になった場合は、どういう対応方法があるのでしょうか。 $a = array('green', 'red', 'yellow'); $b = array('avocado', 'apple', 'banana'); $hoge = array('100', '150', '80'); array_combine()でできるのでしょうか。 他の関数を使うのでしょうか。 不慣れですみません。 アドバイスいただけますとうれしいです。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • array_uniqueについて

    こんにちは。質問させてください。 array_unique関数はPHP4.04以降は使用できないと マニュアルに記述されていました。 ですがどうしても配列内の重複した値を 削除したいのですが、ロジックがうまく 思いつけません・・・ どなたかわかる方はいらっしゃいますか? $test_array = array("america","japan","america","canada","japan"); ⇒ ("america","canada","japan") しかもソートしたいです!! 宜しくお願い致しますm(_ _)m

    • 締切済み
    • PHP
  • phpで携帯サイトを作成しています。

    php超初心者です。 現在、phpにて携帯サイトを作成しています。 サンプルコードなどが記載されている本を購入し、 それを解読しながら、自分なりに修正を加え作成しています。 その中で、どうしても理解できない所があり困っています。 どなたか教えて下さい。 サンプルコード function mobileFinish($convertFunc=null, $funcParams=array()) { // 文字コード変換&バッファ出力 $content = ob_get_contents(); ob_end_clean(); $content = mb_convert_encoding($content, 'sjis-win', 'utf-8'); // 変換処理 if ($convertFunc) { $content = call_user_func_array($convertFunc, array_merge(array($content), $funcParams)); } echo $content; まず function 関数名 (引数1,引数2){ 処理方法 }は 引数1,引数2を使って{ }の中の処理をせよ ということだと思うので、 ”$convertFunc=null”と”$funcParams=array()”を使って{ }の中の処理をせよになり、 { }の中の処理というのが、 $content = ob_get_contents(); ob_end_clean(); $content = mb_convert_encoding($content, 'sjis-win', 'utf-8'); つまり、このコード以前に記述されている出力用バッファの内容を取得して、 バッファをクリアして、 文字コードを”utf-8”から”sjis-win”に変換したものを”$content”に格納する。 ここからが理解できないのです。 if ($convertFunc) { $content = call_user_func_array($convertFunc, array_merge(array($content), $funcParams)); } まず if (条件式) { 処理方法 }は、 条件式が「正」の時{ }の中の処処を行え ということだと思うので、 ”$convertFunc=null”つまり”$convertFuncに値が無い時”に{ }の中の処処を行えになり、 call_user_func_array(”呼び出す関数名”,”関数に渡すパラメータがセットされた配列”)は ”呼び出す関数名”は”$convertFunc=null”なんのこっちゃ? ”関数に渡すパラメータがセットされた配列”も”$content”に格納された内容と ”$funcParams=array()”を”array_merge()”で合体させる・・・ ”$funcParams=array()”には何の値が入っているんだ? ”$convertFunc=null”と”$funcParams=array()”のおかげでチンプンカンプンです。 どなたかPHP訳してください。宜しくお願いします。

    • ベストアンサー
    • PHP
  • PHPのフレームワークはどれを学ぶべきですか?

    PHPは専門学校などいって、ある程度自分一人でも、 簡単なCMSなど作れるようになったものですが、 やはり、作業効率というのも考えないといけないと思っており PHPのフレームワークをぜひ、勉強したいなと思ってます。 それで、調べてみると、何個か代表的なものがあるのですが、 実際の制作会社やメディアで仕事に活かそうと思えば、どのフレームワークを 学んだらよいと思いますか。 ・ZEND ・CakePHP ・symfony それぞれのフレームワークの特徴などもあるかと思いますが ぜひ、活用している方がいれば、いろいろご意見をお聞かせください。

    • 締切済み
    • PHP
  • arrayをどうやって表示するのか?

    array をどうやって表示したら良いのでしょうか? 一応参考書には下記のようなコードがあってそのまま打つと普通にブラウザには出てこないので、print を文頭につけたのですが、「array 」としか出てこないので、どうしたら良いのかわかりません。当然のことながら$cだけ表示できたら良いです。どうかご教授よろしくお願いします。 $a = array(1,2,3); $b = array(1,3,4); $c = array_diff($a,$b);

    • ベストアンサー
    • PHP