我们的自动加载器存在一个神秘的问题:
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
任何想法?
答案 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计算机上的原因。
我现在哭了。