0

我有一个 cakephp 应用程序,在我的一个控制器中,我有一个函数_filter_callback可用作 php 函数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_filter知道我在 cakephp 应用程序中的回调函数吗?

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. 一个数组,其中包含要用作第一个元素的对象实例,以及一个包含该对象内部要调用的方法名称的字符串作为第二个元素:array($object, 'method')
  3. 带有静态方法调用的字符串:'StaticClass::methodName'
  4. 一个数组,类名作为字符串作为第一个元素,静态函数名作为第二个元素:array('StaticClass', 'methodName')
  5. 内联的 lambda 函数:function(){ /*do stuff*/ }
  6. 变量中的 lambda 函数:$lambda

is_callable()可用于检查参数是否可以被调用。

请注意,使用回调取决于可见性。您通常不能使用私有或受保护的方法作为 PHP 函数的参数。他们从全局角度行动,无法从外部访问这些方法。

于 2012-10-23T22:26:41.263 回答