2011-04-22 56 views
6

當定義hook_menu項目時,我可以在類上使用公共靜態方法,而不是使用drupal傾向於使用的全局下劃線命名約定?我可以在drupal中使用靜態方法作爲菜單回調嗎?

例如,是否可接受?

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

我會感興趣,如果你已經嘗試過它並沒有工作。答案可能歸結爲如果PHP支持像這樣動態調用一個函數。 $ foo ='MyClass :: test'; $ foo的(); ......我最初的想法是否定的,但我沒有真正嘗試過。 – Coder1 2011-04-22 16:21:11

回答

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

是的,它應該工作,因爲這樣做:

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

相關問題