2016-12-14 8 views
1

コーディングの問題に取り組むためのアイディアを得るためにいくつかのテストをしています。今、私は理解していない振る舞いをしています。php call_user_func variable error

function product($a, $b) { 
echo "Yo ".$a; 
echo "Yo ".$b; 
} 

call_user_func('product', 'dd', 'lizzy'); 

上記の作品は、しかし、

$variablename = "'product','dd','lizzy'"; 
call_user_func($variablename); 

でエラーが発生します:

Warning: call_user_func() expects parameter 1 to be a valid callback, function ''product','dd','lizzy'' not found or invalid function name

明らかに$変数名は同じ値が含まれています。

誰でも私を私を軌道に乗せるためのヒントはありますか?

+1

の$変数名の内容は何ですか? 'var_dump($ variablename)' –

+0

まったく同じです。 –

+0

うわー!情報提供 –

答えて

1

call_user_funccall_user_func_arrayの署名に注意してください。

function product($a, $b) { 
    echo "Yo ".$a; 
    echo "Yo ".$b; 
    echo "<br>\n"; 
} 

// there are 3 single arguments 
call_user_func('product', 'dd', 'lizzy'); 

// the same with variables 
$fn_name = 'product'; 
$arg1 = 'dd'; 
$arg2 = 'lizzy'; 

call_user_func($fn_name, $arg1, $arg2); 

// or give ARGUMENS ONLY as array, but function name as string scalar 
$args = array($arg1, $arg2); 
call_user_func_array($fn_name, $args); 

// if you for some reason need to handle a single array for the name and arguments in one, 
// you need to write your own function: 
function call_user_func_array2($call_info) 
{ 
    $fn_name = array_shift($call_info); //extract first item 
    call_user_func_array($fn_name, $call_info); 
} 

$call_info = array($fn_name, $arg1, $arg2); 
call_user_func_array2($call_info); 

さらに、指定した文字列"'product','dd','lizzy'"を処理するために上記のコードを拡張することができます。 (たとえば、ある形式のデータベースにこの形式で格納されている場合)

この文字列でコンマ区切りの値を抽出する必要があります。これを達成するには、str_getcsv以上の正規表現を使用できます。オプションの空白文字をカンマで区切り、単一のまたはダブルクォートで囲んだとします。正規表現は次のようになります:(?:^|,)\s*(['"])(.+?)\1\s*?(?=,|$)。 ndサブパート(.+?)は、一重引用符または二重引用符内のすべてをキャプチャします。call_user_func_array2と組み合わせる

それはそのようになっています

function call_user_func_string($call_info) 
{ 
    if(!preg_match_all('~(?:^|,)\s*([\'"])(.+?)\1\s*?(?=,|$)~u', $call_info, $matches)) 
    throw new Exception("call_user_func_string expects parameter 1 to be a string like `'functionname','arg1','arg2' [,...]` " 
         . 'or `"functionname","arg1","arg2" [,...]`.'); 

    call_user_func_array(array_shift($matches[2]), $matches[2]); 
} 


// some differently formatted examples 

$my_string = "'product','dd','lizzy'"; 
call_user_func_string($my_string); 

$my_string = ' "product" , "dd" , "lizzy" '; 
call_user_func_string($my_string); 

$my_string = <<<'_END_' 
    'product' , "dd",'lizzy' ,"lucy's cat" 
_END_; 

call_user_func_string($my_string); 
+0

他のすべての人がそう言ったように、あなたはそれをすることができません。 –

+0

いいえ、私は言う: "あなた*できます。正しい構文と関数の署名を学んでください"。 –

+0

することができます、あなたがそれとは全く違ったやり方をすれば、それは明らかです。 –

1

は、あなたが正確に表示されていなかったものを追加し、あなたの第二試みは、次のようになります。

$variablename = "'product', 'dd', 'lizzy'"; 
call_user_func($variablename); 

第二ラインを実行し、$variablenameだけ引数で、call_user_func()は3を期待しながら。

あなたが得るエラーはかなり普通です!
Definetlyあなたはの1つの引数が複数のものに "ディスパッチ"されることは期待できません。

1

PHP Docs on call_user_funcを見ると、少なくとも1つのパラメータが必要であり、その最初のパラメータはcallableである必要があります。

Obviously $variablename contains the same values.

これがどのように明らかかわかりません。あなたのコードの中にこの値を定義するものはありません。関数またはオブジェクトとメソッドを指定する必要があります(上記の呼び出し可能なリンクを参照してください)。

+0

後続の投稿を見ると、$ variablenameは文字列であり、その内容は関数名ではありません。 –

1

エラーが発生しました。

最初の引数は有効なコールバック/関数名である必要があります。

上記のように$variablenameを設定すると、エラーが発生することがあります。

"'product', 'dd', 'lizzy'あなたのケースでは有効なコールバック名ではありません。