[英]Class not found using namespace compilant PSR-4 on PHP
我对 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 is: ' 。 CpPanelBackTest::getDate();
当 PHP 无法加载或找不到类时会触发您遇到的错误。 该错误消息中的名称是正在搜索的类的完全限定名称。
错误消息中的该名称不包含命名空间。 这意味着您的使用未被检测为使用命名空间。 如果您查看一行,这是正确的: echo 'Date today is: ' . CpPanelBackTest::getDate();
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 将无法检测到前缀和/或将无法找到正确的文件。
不幸的是,您没有进行正确的测试来证明自动加载是错误的。 您应该只删除自动加载器,而是需要包含该类的文件 - 而不禁用命名空间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.