Php 自动加载[编辑]的问题

Php 自动加载[编辑]的问题,php,session,autoloader,Php,Session,Autoloader,我目前在自动加载方面有很多问题。我目前正在使用多个目录来分割我的应用程序,我知道可以更有效地构造这些目录,但是现在我只是想让自动加载器工作 我的目录结构如下: HTML 课程 config.php db.php register.php reset.php session.php SM_handler.php smtp_handler.php validate.php 应用程序 fb_link.php src Facebook图书馆 phpmailer库 核心 init.php(

我目前在自动加载方面有很多问题。我目前正在使用多个目录来分割我的应用程序,我知道可以更有效地构造这些目录,但是现在我只是想让自动加载器工作

我的目录结构如下:

HTML

  • 课程
    • config.php
    • db.php
    • register.php
    • reset.php
    • session.php
    • SM_handler.php
    • smtp_handler.php
    • validate.php
  • 应用程序
    • fb_link.php
    • src
      • Facebook图书馆
  • phpmailer库
  • 核心
    • init.php(我的自动加载器所在的位置)
  • index.php
我尝试了不同的自动加载程序,包括psr-0,但是我似乎无法正确地实现它。例如,我正在使用:

spl_autoload_register( function ($className) {
    $className = ltrim($className, '\\');
    $fileName  = '';
    $namespace = '';
    if ($lastNsPos = strrpos($className, '\\')) {
        $namespace = substr($className, 0, $lastNsPos);
        $className = substr($className, $lastNsPos + 1);
        $fileName  = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
    }
    $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';

    require $fileName;
});
在我的index.php文件中,我包含了autloader:

require_once('/var/www/html/core/init.php');
我已经将名称空间添加到会话类中

namespace classes;
if(!classes\session::exist('ip')){
然后我调用会话类

namespace classes;
if(!classes\session::exist('ip')){
但是,我不断收到与此类似的错误:

require(session.php):无法打开流:第34行的/var/www/html/core/init.php中没有此类文件或目录

我的目录结构错了吗?还是我没有正确使用psr-0?我坚持我能做的。谢谢

编辑:
我现在可以实例化同一目录中的文件,例如/classes/,但是当我调用不同目录中的类时,它没有查找正确的文件夹/var/www/html/app/fb_-link.php,而是查找/var/www/html/classes/app/fb_-link.php,这当然会抛出一个错误,因为不存在任何文件。这是可以解决的吗

自动加载函数返回“classes\session”的“classes/session.php”。这意味着“/var/www/html/”必须位于包含路径中。尝试添加:

set_include_path(implode(PATH_SEPARATOR, array(
    '/var/www/html/',
    get_include_path(),
)));
或者更改自动加载功能以包含完整的文件路径:

require '/var/www/html/' . $fileName;

如果有帮助,请告诉我。

您的包含路径中是否有html目录?get_include_path()返回的是什么?html目录是站点指向的目录,所以我认为这不是必需的?至于名称空间,我认为您不需要包含根?我目前使用的是
AURA
autoloader。它同时处理PSR-0和PSR-4目录。我有一个使用它的
应用程序
引导程序。我对自动装弹机使用的路径进行了手工编码,以便于理解。我还使用了
symfony
autoloader。两者都很好。[auraphp/Aura.Autoload]()我会研究一下,谢谢@RyanVincent。它在windows和linux上工作-不要更改路径分隔符。自动加载器的应用程序部分-这使您更容易了解如何添加目录结构?路径名确实会有所不同,并且连接在一起的文件都在同一个目录中,但是当我在不同的目录中查找类时,它会在classes/app中查找,而不仅仅是app/var/www/html/classes/app/FBlink.php,其中实际目录位于/var/www/html/app/FBlink.php中。您是否将FBlink也放在类名称空间中?这可以解释这个错误。另外,我看到FBlink类名没有跟在文件名fb_link.php后面。如果您的类名不遵循目录结构(使用名称空间或前缀),则无法从autoloader中获益。我建议引入一个类映射数组(className=>文件),并在自动加载程序中使用它,然后慢慢地重构所有类以使用名称空间;我想我可以让它全部工作,但令人沮丧的是,我需要浏览所有facebook文件,并为它们提供与所有phpmailer文件相同的空间。你可以使用composer安装phpmailer。Composer为所有安装了它的库提供自动加载。我不知道你正在使用哪个Facebook库,但它也可能在compser中提供。