【问题标题】:Importing custom class inside a controller在控制器中导入自定义类
【发布时间】:2016-10-06 13:51:38
【问题描述】:

我在 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();
    }
}

这是我遇到的错误:

致命错误:无法声明 Hi 类,因为该名称已在第 2 行的 path\api\src\Controller\Hi.php 中使用

发生了什么事?

MyController.phpHi.php 在同一个文件夹中。我正在使用 PHP 7。

【问题讨论】:

  • 不知道,$a.hi(); 是什么???
  • 只是为了测试...
  • 现在我明白了哈哈哈...是$a-&gt;hi();

标签: php oop cakephp namespaces cakephp-3.0


【解决方案1】:

包含文件不会使该文件中的类成为当前命名空间的一部分,因为命名空间是每个文件的功能。

http://php.net/...namespaces.importing.php#language.namespaces.importing.scope

您的Hi 类将在全局命名空间中声明,而您的new Hi() 将导致PHP 在当前命名空间中查找它,即它将查找不存在的App\Controller\Hi,因此composer autoloader 启动,并将通过 PSR-4 命名空间前缀匹配将其映射到 src/Controller/Hi.php,这将再次包含该文件,这就是它发生的时候。

http://www.php-fig.org/psr/psr-4/

长话短说,虽然使用new \Hi() 可以解决此问题,但您最好不要手动包含类文件,或者在不属于它们的路径中声明它们。而是以适当的自动加载兼容方式声明您的文件和类,例如在与该命名空间匹配的路径中使用适当的命名空间,例如

namespace App\Utils;

class Hi {
    // ...
}

src/Utils/Hi.php

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-07
    • 2021-10-03
    • 2016-04-02
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    相关资源
    最近更新 更多