我在 Cake 项目的 Controller 文件夹中创建了一个类,如下所示:
<?php
class Hi
{
function __construct(){ }
public function hi()
{
echo "hi!";
exit;
}
}
然后在 Controller 中,我尝试将其包含在内:
<?php
namespace App\Controller;
use App\Controller\AppController;
include_once "Hi.php";
class MyController extends AppController
{
public function sayHi()
{
$a = new Hi();
$a.hi();
}
}
这是我遇到的错误:
Fatal error: Cannot declare class Hi, because the name is already in use in path\api\src\Controller\Hi.php on line 2
这是怎么回事?
MyController.php
和 Hi.php
都在同一个文件夹中。我正在使用 PHP 7。
最佳答案
包含文件不会使该文件中的类成为当前命名空间的一部分,因为命名空间是每个文件的功能。
http://php.net/...namespaces.importing.php#language.namespaces.importing.scope
您的 Hi
类将在全局命名空间中声明,您的 new Hi()
将导致 PHP 在当前命名空间中查找它,即它会查找 App\Controller\Hi
,它不存在,因此 Composer 自动加载器启动,并将通过 PSR-4 命名空间前缀匹配将其映射到 src/Controller/Hi.php
,这将再次包含该文件,这就是它发生的时候。
http://www.php-fig.org/psr/psr-4/
长话短说,同时使用 new \Hi()
会解决这个问题,你最好不要手动包含类文件,或者在它们不属于的路径中声明它们。而是以适当的自动加载兼容方式声明您的文件和类,例如,在与该 namespace 匹配的路径中使用适当的 namespace ,例如
namespace App\Utils;
class Hi {
// ...
}
在
src/Utils/Hi.php
关于php - 在 Controller 中导入自定义类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39897857/