在控制器中导入自定义类

时间:2016-10-06 13:51:39

标签: php oop cakephp namespaces cakephp-3.0

我在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.phpHi.php位于同一文件夹中。我使用的是PHP 7。

1 个答案:

答案 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