带有命名空间的 PHP 自动加载不加载文件

PHP autoload with namespaces do not load file

提问人:Jan Bloemkool 提问时间:12/28/2020 更新时间:12/28/2020 访问量:368

问:

我的自动加载器和命名空间有问题。 自动加载器下方

<?php
spl_autoload_register( function( $class ) {

    $folder = 'include/';
    $prefix = 'class.';
    $ext    = '.php';
    
    $fullPath = $folder . $prefix . $class . $ext;
  
    if( !file_exists( $fullPath ) ){
        print 'Class file not found!';
        return false;
    }

    require_once $fullPath;
});
?>

在索引文件下方

<?php
require 'autoload.php';
//use backslash for namespace
$pers = new Person\Person();
?>

类 Person 的文件保存在目录 root->include->Person 我使用了类文件中的命名空间,如下所示

<?php
namespace Person;

class Person{
    function __construct(){
        print 'autoload works';
    }
}
?>

如果我在浏览器中访问索引文件,它会返回“找不到类文件”。 我是否正确使用命名空间?

PHP 命名空间 自动加载

评论

0赞 u_mulder 12/28/2020
echo $fullPath看看它是否相关。
0赞 MGE 12/28/2020
打印$class值时会发生什么?
1赞 Álvaro González 12/28/2020
我不认为您的自动加载器正在考虑命名空间。你的结构需要像这样,这似乎不是你的意图。include/class.Person\Person.php
0赞 Jan Bloemkool 12/28/2020
如果我回显变量$fullPath输出是include/class。人\人:.php
1赞 MGE 12/28/2020
所以现在,你知道问题出在哪里了。include/类。Person\Person,.php 不存在。

答:

0赞 Eden Moshe 12/28/2020 #1

您尝试包括 包含/。人\人:.php

  1. 如果你的 Os 是 linux,你必须知道 / 和 \ 之间有什么不同
  2. 文件夹名称中是否存在前缀类?
0赞 Jop 12/28/2020 #2

稍微更改一下您的自动加载代码

<?php
spl_autoload_register( function( $class ) {

    $folder = 'include/';
    $prefix = '.class';
    $ext    = '.php';
    //replace the backslash 
    $fullPath = $folder . str_replace( "\\", '/', $class ) . $prefix . $ext;

    if( !file_exists( $fullPath ) ){
        print 'Class file not found!';
        return false;
    }
    
    require_once $fullPath;
});
?>