0

私のコントローラーの1つにcakephpアプリケーションがあり、次のような_filter_callbackphp関数array_filter()へのコールバックとして使用される関数があります。

class TestClassController extends AppController
{
     var $name = 'TestClass';

     ....

     function test_fn()
     {
         ...
         array_filter($my_array, '_filter_callback');
     }

     function _filter_callback($val)
     {
          // callback logic here...
     }
}

私が抱えている問題は、次のエラーが発生したため、コントローラーで関数_filter_callbackが見つからないことです。array_filter

Warning: array_filter() expects parameter 2 to be a valid callback, 
function '_filter_callback' not found or invalid function name

誰かが私がarray_filtercakephpアプリケーションで私のコールバック関数を認識する方法を知っていますか?

4

2 に答える 2

5

関数はグローバル スコープ内にありますか? そうでない場合は、そうでなければなりません。関数の本体が単純な場合 (ほとんどの場合)、PHP > 5.3 以降の匿名関数を使用してみてください - http://php.net/manual/en/functions.anonymous.php

または create_function を使用します

http://php.net/manual/en/function.create-function.php

その後、使い捨てのグローバル関数を宣言せずに、これをパラメーターとして挿入できます。

10 より小さいすべての要素をフィルタリングする例:

array_filter($array, create_function('$a', 'return $a > 10;'));

編集:オブジェクトのメソッドを呼び出そうとしていることがわかります。インスタンスを指定する必要があります。これを試して:

array_filter($my_array, array($this, '_filter_callback'));
于 2012-10-23T22:00:00.407 に答える
0

有効な PHP コールバック定義は次のとおりです。

  1. グローバル関数の名前を含む文字列:'functionName'
  2. 最初の要素として使用されるオブジェクトのインスタンスを持つ配列と、2 番目の要素としてこのオブジェクト内で呼び出されるメソッドの名前を持つ文字列:array($object, 'method')
  3. 静的メソッド呼び出しを含む文字列:'StaticClass::methodName'
  4. 文字列としてのクラス名を最初の要素とし、静的関数名を 2 番目の要素とする配列:array('StaticClass', 'methodName')
  5. インライン化されたラムダ関数:function(){ /*do stuff*/ }
  6. 変数内のラムダ関数:$lambda

is_callable()引数を呼び出すことができるかどうかを確認するために使用できます。

コールバックの使用は可視性に左右されることに注意してください。通常、プライベート メソッドまたはプロテクト メソッドを PHP 関数の引数として使用することはできません。それらはグローバルな観点から動作し、外部からこれらのメソッドにアクセスすることはできません.

于 2012-10-23T22:26:41.263 に答える