18

我的项目结构如下:

src/
   ├─ Model/
      └─ User.php

我的 User.php 文件如下所示:

<?php
namespace Bix\Model;

class User {

我的 composer.json 自动加载器是这样的:

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

最后我的 bootstrap.php 是这样的:

use Bix\Model\User;

// PSR-4 Autoloader.
require_once "vendor/autoload.php";

但是,如果我尝试创建一个new User(),我会收到错误Fatal error: Class 'User' not found in /var/www/public/api/v1/index.php on line 8

查看 composer autoload_psr4.php 文件,它看起来不错:

// autoload_psr4.php @由 Composer 生成

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname(dirname($vendorDir));

return array(
    'XdgBaseDir\\' => array($vendorDir . '/dnoegel/php-xdg-base-dir/src'),
    'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
    'KeenIO\\' => array($vendorDir . '/keen-io/keen-io/src'),
    'Bix\\' => array($baseDir . '/src'),
); 

任何人都可以指出我在上面哪里出错了吗?

4

1 回答 1

27

首先,Linux(我不确定您使用哪台 PC)区分大小写。在您的自动加载中,您定义src/bix了 ,而它是src/Bix.

但更重要的是,使用 PSR-4,指定的命名空间前缀包含在目录结构中(以避免目录只包含一个目录)。在您的情况下,如果您配置"Bix\\": "src/",则一个类Bix\Model\User应该位于src/Model/User.php.


编辑:您误解了 PHP 命名空间。在 PHP 中,您并不是说“将所有内容从Bix\Model该文件​​的全局命名空间导入” use Bix\Model;。相反,它的意思是:“Model此文件中的别名为Bix\Model”。

所以你应该这样做:

require_once "vendor/autoload.php";

use Bix\Model;

$user = new Model\User();

或者:

require_once "vendor/autoload.php";

use Bix\Model\User;

$user = new User();
于 2015-05-09T08:43:35.020 回答