基于目录结构的自动加载名称空间

SAz*_*SAz 8 php autoload autoloader spl-autoload-register

根据PHP页面上的最高评论spl_autoload_register( ):

对于具有命名空间类的PHP 5.3用户来说是个好消息:

当您创建与包含类的名称空间匹配的子文件夹结构时,您甚至不必定义自动加载器.

<?php
    spl_autoload_extensions(".php"); // comma-separated list
    spl_autoload_register();
?>
Run Code Online (Sandbox Code Playgroud)

但是,当我有以下结构时:

* classes/someclass.php

* index.php

其中someclass.php包含以下内容:

<?php
    class someclass {
        function __construct( ) {
            echo 'It works!';
        }
    }
?>
Run Code Online (Sandbox Code Playgroud)

index.php包含:

<?php
    spl_autoload_extensions(".php");
    spl_autoload_register();

    new classes\someclass;
?>
Run Code Online (Sandbox Code Playgroud)

然后我收到以下错误:

致命错误:spl_autoload():无法加载类classes\someclass

我弄错了吗?我怎样才能做到这一点?

从评论

这对于班级不起作用:

<?php
    namespace classes;
    class someclass {
        function __construct( ) {
            echo 'It works!';
        }
    }
?>
Run Code Online (Sandbox Code Playgroud)

m4t*_*1t0 5

在someclass.php文件中,您必须在前面定义命名空间.

<?php 
namespace classes;
Run Code Online (Sandbox Code Playgroud)


hak*_*kre 5

TLDR; 它有效,但是:

  • namespace classes; 缺少 classes/someclass.php
  • set_include_path(__DIR__); 缺少 index.php
  • (spl_autoload_extensions(".php")没必要)

包括路径

SPL自动加载的实现是包括基于路径.使用点作为包含路径是相对于工作目录(!),它独立于脚本文件位置.__DIR__如果classes文件夹位于文件旁边,则命名所需的确切目录,index.php如方案中所示.

目录分隔符映射

接下来,自动加载器实现会在Unix系统上正确映射类命名空间分隔符.如果在o/p中丢失,PHP源代码显然有这个.

文件名的大小写敏感度

源代码还显示了要加载的文件名是小写的.也就是说,如果您的文件系统区分大小写,则文件和目录名称必须为小写.


Refernces: