在開發 WordPress Plugin 常用字串來代表 functions ,最常用的莫過於add_action() &add_filter()
add_action('init','function_name');
add_action('init',[$this,'function_name']);
add_filter('init','function_name');
add_filter('init',[$this,'function_name']);
實際上在 WordPress API 中是用 php call_user_func() 來執行傳入的 function,但到了執行階段並沒有辦法直接調用在 Namespace 中的 function , 否則 Namespace 就沒意義了。
所以在 Namespace 文件中用上述的方法呼叫
Namespace V123\DEV;
function test() {
echo "Hello world!\n";
}
add_action('init','test');
會得到下列錯誤訊息,主要是找不到傳入的 function
Warning call_user_func_array() expects parameter 1 to be a valid callback …
正確的傳入的 function 名稱前方需包含Namespace名稱,如下,這樣執行階段就可正確調用到這個方法。
Namespace V123\DEV;
function test() {
echo "Hello world!\n";
}
add_action('init','V123\DEV\test');
有時一個 Plugin 中會傳入很多個,包含 Namespace 名的 function 名稱在我們的程式碼中,但如果我們要修改Namespace名稱就需要一個一個改非常痛苦,這時我們可透過 __NAMESPACE__ 讓城市變得更聰明
使用 __NAMESPACE__ 取得當前文件的 Namespace
呼叫 Namespace 裡的 function
/**
* https://v123.tw
*/
Namespace V123\DEV;
function test() {
echo "Hello world!\n";
}
call_user_func(__NAMESPACE__ .'\test');
呼叫 Namespace 裡的 class 中的 function
/**
* https://v123.tw
*/
Namespace V123\DEV;
class Hello {
static public function test() {
echo "Hello world!\n";
}
}
add_action('init',__NAMESPACE__ .'\Hello::test'); // String
add_action('init',array(__NAMESPACE__ .'\Hello', 'test')); // Array