在定义hook_menu
项时,我可以在类上使用公共静态方法而不是使用drupal倾向于使用的全局下划线命名约定吗?
例如,以下是否可以接受?
$items['test'] = array(
'page callback' => 'MyClass::test',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK
);
答案 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,则应遵循官方编码标准。即使这仅适用于自定义模块。如果有人需要在某个时候拿起你的工作,如果代码遵循在其他地方使用的相同标准,那么对他们来说会更容易。