在PHP上使用命名空间编译PSR-4找不到类

时间:2015-06-18 15:51:24

标签: php namespaces composer-php autoloader namespace-organisation

我对php上的命名空间(> 5.4。*)和作曲家

非常困惑

方案

|vendor
   |autoload.php
    |abkrim
       |cputils
          |src
             |CpPanelBackTest.php

Code CpPanelBackTest.php

namespace Abkrim\Cputils;
class CpPanelBackTest
{
    public static function getDate(){
      $year = date('Y');
      $month = date('m');
      $day = date('d');
      return $day . '/' . $month . '/' . $year;
    }
}

文件test.php

require __DIR__.'/../../vendor/autoload.php';
use Abkrim\Cputils\CpPanelBackTest;
echo 'Date today is: ' . CpPanelBackTest::getDate();

在vendor / abkrim / cputils上的文件composer.json

"autoload": {
   "psr-4": {
      "Abkrim\\Cputils\\": "src/"
   }
}

获取错误 - >

PHP Fatal error:  Class 'CpPanelBackTest' not found in at file xxxx line xxxx

如果更改CpPanelBackTest.php的代码

//namespace Abkrim\Cputils; //coment namespace
class CpPanelBackTest
{
    public static function getDate(){
      $year = date('Y');
      $month = date('m');
      $day = date('d');
      return $day . '/' . $month . '/' . $year;
    }
}

并提交test.php文件

//require __DIR__.'/../../vendor/autoload.php';
//use Abkrim\Cputils\CpPanelBackTest;
require_once __DIR__ . '/../../vendor/abkrim/cputils/src/CpPanelBackTest.php';

现在工作正常。

我输了。 我对此一无所知     echo'今天的日期是:' 。 CpPanelBackTest :: GETDATE();

1 个答案:

答案 0 :(得分:1)

当PHP无法加载或查找类时,会触发您遇到的错误。该错误消息中的名称是要搜索的类的完全限定名称。

错误消息中的该名称不包含命名空间。这意味着您的使用未被检测为使用命名空间。如果你看一行,这是正确的:echo 'Date today is: ' . CpPanelBackTest::getDate();这里没有命名空间。

之前你有一个use语句,它应该将类导入当前(全局)命名空间。而且我相信它会这样做 - 我的测试显示你问题中发布的代码可能正常工作。问题是:我发现很难用Composer创建一个完整的测试用例,一个单独的包,包括它等等,所以我只运行了一个微小的替换测试,它没有考虑到文件系统的差异。 / p>

<?php

namespace Foo {
class Bar {}
}

namespace {
use Foo\Bar;
var_dump(new Bar);
}

查看实际操作:http://3v4l.org/mrVsI

这是我的猜测:PHP类不区分大小写,但是从类名转换为路径和文件名在某些文件系统上区分大小写。如果您在代码中只输错了一个字母,则Composer将无法检测到前缀和/或无法找到正确的文件。

不幸的是,您没有做正确的测试来证明自动加载是错误的。您应该只删除自动加载器,而是需要包含该类的文件 - 而不禁用命名空间。