0

我有一個奇怪的問題,我用PHP構建的自動加載器類在WordPress中使用。PHP自動加載和WordPress

核心概念是它應該加載類,而不管你是孩子的主題,父主題還是插件。它應該找到基於名稱(coreesponding文件夾結構類:CoreTheme_Folder_SubFolder_ClassName(){} = CoreTheme/Folder/SubFolder/ClassName.php

這個作品在兒童主題和父主題,在孩子的主題包括我function.php並從那裏加載父主題精自動加載器,這樣我就可以在子主題中調用父主題類,並且不會在每個地方都有一堆require_once()

問題出現了,當我在插件中執行相同的概念時,Autoloader是一個框架如果這個主題是主動的,並且我在插件中設置了自動加載器,它會大聲說「這個自動加載器有兩個實例,你在做什麼?」如果我停用說當時的主題整理插件中的自動加載器,它無法找到我使用梨命名標準創建的任何類。

所以我的問題對於那些在更深層次上理解WordPress和PHP的人來說,我如何創建我的自動加載器,使得無論天氣如何,你的主題,子主題或插件都會找到你正在尋找的課程。

下面的代碼是autloader類。如果你拿出:plugin_dir_path(__FILE__)那麼會發生什麼是自動裝載機將加載任何類的主題和相應的兒童主題。

class AisisCore_Loader_AutoLoader{ 

    protected static $_instance; 

    protected static $_directories; 

    public function get_instance(){ 
     if(null == self::$_instance){ 
      self::$_instance = new self(); 
     } 

     self::$_directories = array(
      get_template_directory(), 
      get_stylesheet_directory(), 
      plugin_dir_path(__FILE__), 
     ); 

     return self::$_instance; 
    } 

    public function reset_instance(){ 
     self::$_instance = null; 
    } 

    public function register_auto_loader(){ 
     spl_autoload_register(array($this, 'load_class')); 
    } 

    public function load_class($class){ 
     $path = str_replace('_', '/', $class); 
     foreach(self::$_directories as $directories){ 
      if(file_exists($directories . '/' . $path . '.php')){ 
       require_once($directories . '/' . $path . '.php'); 
      } 
     } 
    } 
} 

類是在你父母的functions.php通過實例:

// Load the autoloader. 
require_once(get_template_directory() . '/AisisCore/Loader/AutoLoader.php'); 

// Setup the autoloader. 
$auto_loader = AisisCore_Loader_AutoLoader::get_instance(); 
$auto_loader->register_auto_loader(); 

然後在子主題所有你需要做的是:

require_once(TEMPLATEPATH . '/functions.php'); 

這允許自動加載磁帶機在兒童和父母的主題上工作。主要的問題是,當你創建一個插件,您將框架的一個副本在你的插件的名稱根目錄:在你的主題plugins/myplugin/AisisCore/和一個(父)Themes/MyTheme/AisisCore

所以我能看到爲什麼它會崩潰了 - 那種,有什麼方法可以解決它?

+0

'plugin_dir_path(__ FILE __)'很可能是錯誤的。你也不需要單身人士,只需添加目錄,然後你就可以在運行中註冊新的插件或主題目錄。改爲使用抽象類,這在Wordpress中效果更好。像@hakre在[你之前的問題]中建議你(http://stackoverflow.com/q/15534211/2261774)。 –

+0

其實該功能是正確的,如WordPress中所述,如果不是整個應用程序會崩潰,我的類的實現是正確的,因爲它的工作原理 - 我看不到抽象類的優點,但感謝那;)。這裏的問題是,如果任何活動的主題都有AisisCore庫,它就會嚇倒。問題在這裏:http://wordpress.stackexchange.com/questions/95742/am-i-not-understanding-plugins是關於自動加載器沒有看到任何插件目錄中的插件。 – TheWebs

+0

有條件地檢查自動裝入器是否在插件或主題內初始化。你需要排除這個問題(你也會在學習時學習有用的東西)。 'plugin_dir_path(__ FILE __)'是一個faker。注意什麼'__FILE__'是。見源代碼:http://core.trac.wordpress.org/browser/tags/3.5.1/wp-includes/plugin.php#L577 –

回答

0

我想你想只裝一類,所以使用return;這樣

public function load_class($class){ 
    $path = str_replace('_', '/', $class); 
    foreach(self::$_directories as $directories){ 
     if(file_exists($directories . '/' . $path . '.php')){ 
      require_once($directories . '/' . $path . '.php'); 
      return; 
     } 
    } 
} 

,否則你將加載多個類。看看這個: http://php.net/return