【问题标题】:issues when autoloading files with psr-4使用 psr-4 自动加载文件时的问题
【发布时间】:2023-03-09 11:45:02
【问题描述】:

我已经尝试让 psr-4 自动加载工作一个多星期了,但没有成功。

我的文件结构如下:

-Project
  -src
    -classes
       session.php
  -vendor
  index.php

我已经创建了 psr-4 自动加载功能如下:

 "autoload": {
        "psr-4": {
         "classes\\": "src/classes"
    }

}

在使用 composer dump-autoload -0 之后,在我的 session.php 类中,我给了命名空间:

namespace classes;

class session{

public static function exist($name){

    return(isset($_SESSION[$name])) ? true : false;
}

然后我需要自动加载器并使用 use 函数来命名会话类,如下所示:

use src\classes\session as session;

require_once('vendor/autoload.php');

session::put('test', 'test');

打开index.php页面后,我得到一个

致命错误:在第 10 行的 /var/www/test/Project/index.php 中找不到类 'src\classes\session'

我的目录结构/php 是否正确?我在网上尝试了许多不同的指南,但似乎无法正常工作。

【问题讨论】:

    标签: php composer-php autoload psr-4


    【解决方案1】:

    最简单的解决方案:

    use classes\session;
    
    require_once('vendor/autoload.php');
    
    session::put('test', 'test');
    

    不相关

    但是,您可能不想使用 classes 作为供应商命名空间,而是在这里和那里调整一些东西:

    目录结构

    -Project
      -src
        Session.php
      -public
        index.php
      -vendor
    

    composer.json 中的自动加载配置

    {
        "autoload": {
            "psr-4": {
                "Juakali\\": "src"
            }
        }
    }
    

    Juakali 替换为您喜欢的供应商命名空间,这只是一个建议。理想情况下,如果您打算发布您的包,它应该是尚未被其他人声明的包,请参阅https://packagist.org

    参考见

    Juakali\Session

    使用您选择的上述供应商命名空间:

    namespace Juakali;
    
    class Session
    {
        public static function exist($name)
        {
            return isset($_SESSION[$name]);
        }
    }
    

    考虑使用广泛使用的编码风格,例如 PSR-2。

    参考,见

    index.php

    假设您想公开 index.php 作为 Web 应用程序的入口点,将其移动到您有信心公开为 Web 服务器的文档根目录的目录中,调整 index.php 中的导入,如以及vendor/autoload.php的路径:

    use Juakali\Session;
    
    require_once __DIR__ . '/../vendor/autoload.php';
    
    Session::put('test', 'test');
    

    【讨论】:

    • 编辑后 - 这个答案比我的更彻底,好东西 localheinz
    • 非常感谢您的帮助。如果我要使用 src 文件夹中的类中的 phpmailer 等依赖项,我还需要使用 use\vendor\phpmailer.. 等还是只包含供应商自动加载器?
    【解决方案2】:

    您似乎将“src/classes”的别名定义为“classes”。 所以你需要使用:

    use classes\session;
    

    相反

    更多信息: PSR-4 autoloader Fatal error: Class not found

    【讨论】:

      猜你喜欢
      • 2018-07-25
      • 1970-01-01
      • 2021-08-29
      • 2014-03-24
      • 1970-01-01
      • 2015-01-08
      • 2015-04-20
      • 2014-08-02
      • 1970-01-01
      相关资源
      最近更新 更多