我在Cake项目的Controller文件夹中创建了一个类,如下所示:
<?php
class Hi
{
function __construct(){ }
public function hi()
{
echo "hi!";
exit;
}
}
然后在控制器中,我试图包含它:
<?php
namespace App\Controller;
use App\Controller\AppController;
include_once "Hi.php";
class MyController extends AppController
{
public function sayHi()
{
$a = new Hi();
$a.hi();
}
}
以下是我遇到的错误:
致命错误:无法声明类嗨,因为该名称已在第2行的路径\ api \ src \ Controller \ Hi.php中使用
发生了什么?
MyController.php
和Hi.php
位于同一文件夹中。我使用的是PHP 7。
答案 0 :(得分:4)
包含文件不会使该文件中的类成为当前命名空间的一部分,因为命名空间是每个文件的功能。
<强> http://php.net/...namespaces.importing.php#language.namespaces.importing.scope 强>
您的Hi
类将在全局命名空间中声明,而您的new Hi()
将导致PHP在当前命名空间中查找它,即它将查找App\Controller\Hi
,它不会#39; t存在,因此作曲家自动加载器启动,并将通过PSR-4命名空间前缀匹配将其映射到src/Controller/Hi.php
,其将再次包括该文件,以及它何时发生。< / p>
<强> http://www.php-fig.org/psr/psr-4/ 强>
长话短说,虽然使用new \Hi()
会解决这个问题,但最好不要手动包含类文件,或者在不属于它们的路径中声明它们。而是以适当的自动加载兼容方式声明您的文件和类,例如在与该命名空间匹配的路径中使用适当的命名空间,例如
namespace App\Utils;
class Hi {
// ...
}
在
src/Utils/Hi.php