php - 在 Controller 中导入自定义类

标签 php oop cakephp namespaces cakephp-3.0

我在 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.phpHi.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/

相关文章:

php - Laravel 如何将数据插入到彼此具有外键的两个表中

php - 在 Linux 上编译 PHP 还是使用 apt-get/yum?

php - htaccess 重写 - 文件名无法识别

java - 使用不同的组件(功能)构建自定义 Java 对象

php - CakePHP - fatal error : Call to undefined function

php - 包含日期的复杂查询

Java如何处理一个类型的对象

javascript - 在 JavaScript 中创建集合(相同类型的唯一元素)时,通常使用什么作为键的值?

mysql - CakePHP 3.x -> 属于 Many 的三张表

cakephp - 如何为所有 Controller 只订购一次数据?