2010-06-24 81 views
1

我有一個聲明插件,並迷上按照此相關的問題描述的最佳做法:像功能文件,插件,並在WordPress主題萬畝作用域

Wordpress: Accessing A Plugin's Function From A Theme

所以看起來(platonically)這樣的:

if (!class_exists('Foo')) { 
    class Foo { 
    ... 
    public function do_stuff() { 
     // does stuff 
    } 
    } 
} 

if (class_exists('Foo')) { 
    $MyFoo = new Foo(); 
} 

現在,如果我從一個主題文件調用$ MyFoo-> do_stuff(),例如,比方說,single.php中,$ MyFoo其實does_stuff,我看到在頁面輸出。然而,如果我在functions.php中編寫一個函數來調用$ MyFoo-> do_stuff(),然後從single.php中調用該函數,則找不到該對象。綜上所述,

作品:

in themes/my_theme/single.php: 
    if (isset($MyFoo)) 
    $MyFoo->do_stuff(); 

不起作用:

in themes/my_theme/functions.php: 
    function do_some_foo_stuff() { 
    ... 
    if (isset($MyFoo)) { 
     $MyFoo->do_stuff(); 
    } else { 
     echo "no MyFoo set"; 
    } 
    ... 
    } 
themes/my_theme/single.php: 
    if (isset($MyFoo)) 
    do_some_foo_stuff(); 

輸出 - > 「無MyFoo集」

這可能是完全不足爲奇,但它的東西,我需要/想工作,所以如果任何人都可以解釋發生了什麼,我會感激。爲什麼主題的函數文件(或mu插件中的其他插件文件)無法找到$ MyFoo對象?

回答

2

閱讀variable scope。函數do_some_foo_stuff()中的變量$MyFoo不可訪問,除非您聲明全局優先;

function do_some_foo_stuff() 
{ 
    global $MyFoo; 
    ... 
} 
+0

謝謝,這是一個有效的解決方案,但我想我還是不明白的WP架構不夠好理解爲什麼插件變量是直接入店(沒有一個全球性的聲明)在主題描述文件,如single.php和home.php,但超出了functions.php文件的範圍。你有任何關於變量範圍的參考資料的特別推薦嗎? – Bee 2010-06-27 02:35:18

+0

與WordPress相關的內容較少,更多關於PHP變量範圍。主題文件僅包含在腳本中的PHP文件,並且可以訪問父範圍內的變量。就個人而言,我嘗試並全面避免使用全局變量 - 我認爲單例類會更適合您的目的 - http://www.tonymarston.net/php-mysql/singleton.html – TheDeadMedic 2010-06-27 09:35:09