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

我有 5 个脚本:

  1. database.php
  2. parent.php
  3. child1.php
  4. child2.php
  5. 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),效果很好。

我该如何纠正?

【问题讨论】:

    标签: php oop


    【解决方案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】:

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

      1. 您之前没有创建此类的实例
      2. 如果您从类方法调用它,请确保在您调用的类上设置了 __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]
            猜你喜欢
            • 2021-08-17
            • 2020-06-21
            • 2023-03-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-04-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多