子主题继承和php自动加载

时间:2013-03-20 作者:TheWebs

我在一个父类中编写了这个方法,它将根据类名自动加载一个类,因此如果类名是:SomeFolder\\u Folder\\u Folder\\u class。php然后将其转换为:SomeFolder/Folder/Folder/Class。php并加载它(如果存在):

public function load_class($class){
    $path = str_replace(\'_\', \'/\', $class);
    if(file_exists(get_template_directory() . \'/\' . $path . \'.php\')){
        require_once(get_template_directory() . \'/\' . $path . \'.php\');
    }
}
这与spl_autoload_register() 以实现此“自动加载”功能。因此,不要只做一次就有一堆require\\u:new SomeFolder_Folder_Folder_Class() 它会自动加载。

这在父主题中非常有效,甚至在从父主题加载类时在子主题中也非常有效。然而,当试图从子主题加载类时,它失败了,并表示找不到所述类。

所以我想让我们这样做:

public function load_class($class){
    $path = str_replace(\'_\', \'/\', $class);
    if(is_child_theme()){
        if(file_exists(get_template_directory() . \'/\' . $path . \'.php\')){
            require_once(get_template_directory() . \'/\' . $path . \'.php\');
        }
    }else{
        if(file_exists(get_template_directory() . \'/\' . $path . \'.php\')){
            require_once(get_template_directory() . \'/\' . $path . \'.php\');
        }
    }
}
但随后家长主题类开始发疯,抱怨找不到它们,所以我增加了一个新的复杂性:

public function load_class($class){
    $path = str_replace(\'_\', \'/\', $class);
    if(is_child_theme()){
        if(file_exists(get_stylesheet_directory() . \'/\' . $path . \'.php\')){
            require_once(get_stylesheet_directory() . \'/\' . $path . \'.php\');
        }else{
            if(file_exists(get_template_directory() . \'/\' . $path . \'.php\')){
                require_once(get_template_directory() . \'/\' . $path . \'.php\');
            }
        }
    }else{
        if(file_exists(get_template_directory() . \'/\' . $path . \'.php\')){
            require_once(get_template_directory() . \'/\' . $path . \'.php\');
        }
    }
}
但是,我们又回到了原点,在那里你找不到儿童主题课。。。。

那么,既然如此,该怎么办呢?如何让自动加载器同时在父主题和子主题中工作?

增加了复杂性?子主题类可以扩展和实现父主题类。

有什么想法?

1 个回复
SO网友:fuxia

使用locate_template() 相反

public function load_class( $class ) 
{
    $path = str_replace(\'_\', \'/\', $class);
    // returns a path when something was found
    $located = locate_template( $path, TRUE );

    return $located ? TRUE : FALSE;
}
始终返回FALSE 在自动加载器中,如果尚未找到该类。

结束