PHP自动加载器 - $ classname包含整个文件夹路径而不仅仅是类名本身?

时间:2015-07-17 09:46:52

标签: php wordpress oop namespaces autoloader

我遵循WordPress的命名约定,其中类My_Class应该驻留在名为class-my-class.php的文件中。我使用this autoloader用于WordPress,由Rarst编写。如果我打印出$class_name变量,我会看到前缀class被附加到文件夹名称而不是类文件。我之前使用过的其他一些自动装载机也遇到了同样的问题。我可以做一些字符串操作并得到我想要的但我想知道究竟是什么问题。

可能出现什么问题?

2 个答案:

答案 0 :(得分:0)

我刚刚看了一下你链接到的这个自动加载器,我想它应该是第21行的东西:

$class_path = $this->dir . '/class-' . strtolower( str_replace( '_', '-', basename( $class_name ) ) ) . '.php';

basename仅获取路径的文件部分+文件扩展名。

您还需要检查此自动加载器文件的位置,因为$ this-> dir设置为 DIR ,这是自动加载器文件所在的目录。

答案 1 :(得分:0)

使用灵活的装载机。 试试这个。

function TR_Autoloader($className)
{
$assetList = array(
    get_stylesheet_directory() . '/vendor/log4php/Logger.php',
    // added to fix woocommerce wp_email class not found issue
    WP_PLUGIN_DIR . '/woocommerce/includes/libraries/class-emogrifier.php'
    // add more paths if needed.
);

// normalized classes first.
$path = get_stylesheet_directory() . '/classes/class-';
$fullPath = $path . $className . '.php';

if (file_exists($fullPath)) {
    include_once $fullPath;
}

if (class_exists($className)) {
    return;
} else {  // read the rest of the asset locations.
    foreach ($assetList as $currentAsset) {
        if (is_dir($currentAsset)) {
            foreach (new DirectoryIterator($currentAsset) as $currentFile) {
                if (!($currentFile->isDot() || ($currentFile->getExtension() <> "php")))
                    require_once $currentAsset . $currentFile->getFilename();
            }
        } elseif (is_file($currentAsset)) {
            require_once $currentAsset;
        }

    }
}
}

spl_autoload_register('TR_Autoloader');