PHP:无法声明类,因为名称已在使用中

Posted

技术标签:

【中文标题】PHP:无法声明类,因为名称已在使用中【英文标题】:PHP: cannot declare class because the name is already in use 【发布时间】:2017-07-29 16:19:23 【问题描述】:

我有 5 个脚本:

    database.php parent.php child1.php child2.php somescript.php

parent.php 类如下所示:

include 'database.php';

class Parent 
    public $db;
    function __construct() 
        $this->db = new Database();
    

child1.phpchild2.php 类如下所示:

include 'parent.php';

class Child1 extends Parent 
    function __construct() 
        parent::__construct();
    

    function useDb() 
        $this->db->some_db_operation();
    

问题

当我尝试在 somescript.php 中同时包含 child1 和 child2 时,它返回以下错误:

无法声明类数据库,因为该名称已在 database.php 在第 4 行 (这是包含单词 'class Database' 的行)

但如果我只包含一个文件(child1 或 child2),效果很好。

我该如何纠正?

【问题讨论】:

【参考方案1】:

您想使用include_once() 或require_once()。另一种选择是创建一个附加文件,其中包含您的所有类以正确的顺序包含,这样他们就不需要自己调用包含:

“classes.php”

include 'database.php';
include 'parent.php';
include 'child1.php';
include 'child2.php';

那么你只需要:

require_once('classes.php');

【讨论】:

我在项目中的任何地方都使用了 include_once,但仍然会发生这种情况。它曾经工作过 @Dan,您仍然需要确保包含的顺序正确,以便在定义类时已经包含父类。 这个答案应该被接受。解决问题,切入主题并提供示例。【参考方案2】:

尝试使用include_oncerequire_once代替includerequire

【讨论】:

【参考方案3】:

我之前遇到过这个问题,要解决这个问题, 只需确保:

    您之前没有创建此类的实例 如果您从类方法调用它,请确保在您调用的类上设置了 __destruct。

我的问题(之前): 我有课:核心、路由器、权限和渲染 核心包含Router类,Router调用Permissions类,Router__destruct调用Render类,出现“Cannot declare class because the name is already in use”的错误。

解决方案: 我在 Permission 类上添加了 __destruct 并且 __destruct 是空的并且它是固定的......

【讨论】:

【参考方案4】:

include_once 或 require_once 的另一个选项是使用类自动加载。 http://php.net/manual/en/language.oop5.autoload.php

【讨论】:

【参考方案5】:

您应该使用 require_once 和 include_once。在parent.php里面使用

include_once 'database.php';

在child1.php和child2.php里面使用

include_once 'parent.php';

【讨论】:

【参考方案6】:

Class Parent 不能被声明,因为它是 PHP 保留关键字,所以实际上它已经在使用中了

【讨论】:

我已将 ErrorController 类的名称从 'Error.php' 更改为 'ErrorHandler.php' 并修复了它。从 PHP 7 开始,错误类是保留关键字,因此已经在使用 [php.net/manual/de/class.error.php]

以上是关于PHP:无法声明类,因为名称已在使用中的主要内容,如果未能解决你的问题,请参考以下文章

致命错误:无法声明类 Locale,因为该名称已在

无法声明类 App\User,因为该名称已在我的浏览器中使用

无法声明类,因为该名称已在使用中?

以 Clover XML 格式生成代码覆盖率报告 ... PHP 致命错误:无法声明类 ...,因为名称已在

“无法声明类 App\Http\Controllers\category,因为该名称已在使用中”

(1/1) FatalErrorException 无法声明比特币类,因为该名称已在 easybitcoin.php 第 4 行中使用