-3

我对 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 'Date today is: ' 。CpPanelBackTest::getDate();

4

1 回答 1

1

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

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

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

<?php

namespace Foo {
class Bar {}
}

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

在行动中看到它:http: //3v4l.org/mrVsI

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

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

于 2015-06-18T18:38:00.657 回答