2009-10-09 14 views
6

私はcall_user_func_arrayで関数を呼び出したいと思いますが、引数が関数定義内の参照であり、call_user_func_arrayの単純な値である場合、次の警告が表示されます。 警告:test()ここでPHP変数が参照であるかどうかを知る方法?

を所定の基準値は、私が何をしようとしています何の簡単な例です:

<?php 
$a = 0; 
$args = array($a); 
function test(&$a) { 
    $a++; 
} 
$a = 0; 
call_user_func_array('test', $args); 
?> 

私の質問は:値($ argsをこの場合の最初の値)かどうかはどのように知ることができます参照かどうか?

答えて

2

このPHPのドキュメントページ上のコメントをチェックアウト:

http://php.net/manual/en/language.references.spot.php

+1

私が見るすべては、2つの配列/オブジェクト/変数が1つを変更してかどうかをチェックすることで、同じメモリ領域を指しているかどうかをチェックする機能ですもう一方も変更されています。 私のコード(実際の例ではありません)では、私は引数の配列しか持っていません。一つの引数が参照であるかどうかを知りたいのです。 このように、コールバック関数が参照を必要とし、配列に単純な値が含まれていると、私はエラーをスローすることができます。 –

+0

既に開発者向けの警告が表示されます。どのようなエラーが欲しいですか?動作を変更したい場合は、[カスタムエラーハンドラを設定する](http://php.net/set_error_handler)を使用できます。 – cmbuckley

4

いいえ、問題は、関数の最初のパラメータは参照渡しされていること(機能を意味することに引数を変更することができますです呼び出し元のスコープ)。したがって、最初の引数として代入可能な変数などを渡す必要があります。 array($a)のような配列を作成すると、変数$a(0)の値が配列のスロットにコピーされます。これは変数$aを何らかの形で参照していません。関数を呼び出すときにこれをやっているかのように。そして、それは動作しない、次のとおりです。

test(0) 

あなたは本当に、あなたが参照によって配列に$aを置くことがしたかったが、それはちょっとトリッキーだ場合:

<?php 
$a = 0; 
$args = array(&$a); 
function test(&$a) { 
    $a++; 
} 
call_user_func_array('test', $args); 
?> 

どのように言えば、配列要素は参照です...それは難しいです。あなたがアレイ上var_dump()を行うには、「&」のシンボルを検索できます。

> var_dump($args); 
array(1) { 
    [0]=> 
    &int(1) 
} 
+0

はい、コードはそのように動作します。私は、call_user_func_arrayを呼び出すときにエラーを避けるために、$ args配列(これは何かを含むことができるので、別の関数によって渡されるため)を作成する方法が必要でした。 そのため、配列の変数が参照かどうかをチェックする方法を知りたいのです。 –

関連する問題