我可以在drupal中使用静态方法作为菜单回调吗?

时间:2011-04-22 14:44:45

标签: drupal drupal-6

在定义hook_menu项时,我可以在类上使用公共静态方法而不是使用drupal倾向于使用的全局下划线命名约定吗?

例如,以下是否可以接受?

$items['test'] = array(
  'page callback' => 'MyClass::test',
  'access arguments' => array('access content'),
  'type' => MENU_CALLBACK
);

2 个答案:

答案 0 :(得分:2)

menu_execute_active_handler(),它是调用菜单回调的Drupal函数,包含以下代码:

if ($router_item = menu_get_item($path)) {
  if ($router_item['access']) {
    if ($router_item['file']) {
      require_once($router_item['file']);
    }
    return call_user_func_array($router_item['page_callback'], $router_item['page_arguments']);
  }
  else {
    return MENU_ACCESS_DENIED;
  }
}

在PHP 5.2.3或更高版本中,可以将call_user_func()称为call_user_func('MyClass::myCallbackMethod')

我能看到的唯一问题是第三方模块不期望菜单回调是类静态方法,并使用function_exists($menu_callback)
然后,正如Coder1报告的那样,如果Drupal核心模块或其他模块尝试使用类似于以下的代码调用menu_callback,那么它们可能会导致PHP错误。

$menu_callback = $router_item['page_callback'];
$menu_callback($router_item['page_arguments']);

答案 1 :(得分:1)

是的,它应该有效,如下所示:

class Test {
  static function method() { echo 'Yes'; }
}

$name = 'Test::method';
call_user_func_array($name, array());

但是,你为什么要这样做?

正如你所说,通常使用普通函数(你可以在必要时通过菜单系统自动延迟加载)进行页面回调。

如果您使用Drupal,则应遵循官方编码标准。即使这仅适用于自定义模块。如果有人需要在某个时候拿起你的工作,如果代码遵循在其他地方使用的相同标准,那么对他们来说会更容易。

另见http://groups.drupal.org/node/20728#comment-71907