require_once无法在Windows 10上加载现有文件(适用于Linux)

时间:2017-02-21 16:51:26

标签: php windows psr-4

我们的自动加载器存在一个神秘的问题:

function psr4_default_autoload( $class )
{
    // project-specific namespace prefix
    $prefix = 'basefolder\\';

    // base directory for the namespace prefix
    $base_dir = SOURCE_DIR . '/';

    // does the class use the namespace prefix?
    $len = strlen( $prefix );
    if ( strncmp( $prefix, $class, $len ) !== 0 ) {
        // no, move to the next registered autoloader
        return;
    }

    // get the relative class name
    $relative_class = substr( $class, $len );

    // replace the namespace prefix with the base directory, replace namespace
    // separators with directory separators in the relative class name, append
    // with .php
    $file = $base_dir . str_replace( '\\', '/', $relative_class ) . '.php';

    if ( file_exists( $file ) ) {
        require_once $file;
    }
}

SOURCE_DIR是绝对路径。否则,它是原始的psr4自动加载器示例:https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md

此自动加载器适用于我的Linux PC和服务器。但是,在Windows file_exists( $file )上返回true,但require_once $file;无法正常工作。如果我们回显$file,它将返回我们想要加载的文件,文件也完全存在。

错误消息是:

  

致命错误:Class' basedir \ DatabaseAbstraction \ _ AEntity'在第14行的C:\ xampp \ htdocs \ xyz \ classes \ DatabaseAbstraction \ Entity \ UserLogin.php中找不到

该行是:class UserLogin extends AEntity。上下文:

namespace basedir\DatabaseAbstraction\Entity;


use basedir\DatabaseAbstraction\AEntity;

class UserLogin extends AEntity

任何想法?

2 个答案:

答案 0 :(得分:2)

Windows目录分隔符是“\”而Linux是“/”;您应该使用“DIRECTORY_SEPARATOR”关键字来表示用于创建路径的字符。它在运行时确定,具体取决于当前的操作系统。

在你的情况下会给出:

$base_dir = SOURCE_DIR . DIRECTORY_SEPARATOR;
[...]
$file = $base_dir . str_replace( '\\', DIRECTORY_SEPARATOR, $relative_class ) . '.php'; // assuming your $base_dir follows the same logic

您还必须相应地重写SOURCE_DIR。

答案 1 :(得分:0)

仅供记录:

文件AEntity.php以<?而不是<?php开头。这就是为什么该文件没有加载到该Windows计算机上的原因。

我现在哭了。