【问题标题】:Class not found using namespace compilant PSR-4 on PHP在 PHP 上使用命名空间编译器 PSR-4 找不到类
【发布时间】:2015-09-04 08:59:43
【问题描述】:

我对 php (>5.4.*) 和 composer 上的命名空间感到非常困惑

场景

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

代码 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();

【问题讨论】:

  • 难以置信。 4个负面点和任何评论。有这种不良做法的版主吗?
  • 请注意,将“SOLVED”写在标题中被认为是不好的做法。 Stack Overflow 鼓励在自己的答案中给出解决方案,最有帮助的答案用绿色复选标记标记为已接受。您可以回答自己的问题,也可以接受自己的答案。

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


【解决方案1】:

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

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

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

<?php

namespace Foo {
class Bar {}
}

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

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

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

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

【讨论】:

  • 更简单.. add require 'vendor/autoload.php';在 test.php 上工作正常。
  • 问题更复杂。我询问场景,使用composer+php5+psr-4。运行 composer 如果你的 composer.json 包和你的 composer.json 包没问题,它必须在 vendor/composer/autoload_psr4.php 上写一行以正确应用你的包的命名空间 psr-4 编译器。
猜你喜欢
  • 2016-05-18
  • 2016-01-22
  • 2016-11-18
  • 2015-09-22
  • 2014-11-12
  • 2015-12-03
  • 2015-12-10
  • 1970-01-01
  • 2013-07-04
相关资源
最近更新 更多