【问题标题】:Fatal error: Cannot redeclare class Database致命错误:无法重新声明类数据库
【发布时间】:2014-05-28 07:53:50
【问题描述】:

我有胎儿错误信息说:

致命错误:无法在第 3 行的 C:\wamp\www\pets_new\lib\database.php 中重新声明类数据库

require_once("lib/message.php");
require_once("lib/user.php");

并全部连接到数据库类

课堂留言

<?php

require('database.php');

class Message{

类用户:

<?php

require('database.php');

class User{

【问题讨论】:

  • 你的 2-line sn-p 不是database.php,是吗?
  • 每个类都包含这一行 require_once("lib/database.php") ;
  • 检查您的 user.php 或 message.php 文件。您已经包含了一个 database.php 文件,其中已经声明了类 Database。

标签: php oop


【解决方案1】:

您在一次“运行”中包含 2 个文件。可以这样想:PHP 将所有包含的文件放在一起创建一个大脚本。每个includerequire 都会获取一个文件,并将其内容粘贴到那个大脚本中。

您包含的两个文件都需要同一个文件,该文件声明了Database 类。这意味着 PHP 生成的大脚本如下所示:

class Message
{}
class Database
{}//required by message.php
class User
{}
class Database
{}//required by user.php

如您所见,Database 类被声明了两次,因此出现错误。
目前,一个快速的解决方法是将require('database.php'); 语句替换为:

require_once 'database.php';

这会检查该特定文件之前是否未被包含/需要。如果之前已经包含/需要它,PHP 将不再需要它。
恕我直言,一个更明确、更好的解决方案是注册一个自动加载器函数/类方法,并让该代码处理业务。

更多关于如何注册自动装载机can be found in the docs。如果你走这条路,你可能想看看关于类名和命名空间的编码标准here。如果您符合这些标准,您不必编写自己的自动加载器,并且可以简单地使用 Symfony2 的通用类加载器,或任何其他订阅 PHP-FIG 标准的框架(如 CodeIgnitor、Zend、Cake.. .你的名字)

【讨论】:

    【解决方案2】:

    尝试这样,同时声明类

    if(  !class_exists('database') ) {
        require('database.php');
    }
    

    【讨论】:

    • @EliasVanOotegem 似乎有时你需要。我刚刚遇到过这样的情况,所以这对我有帮助(不,在我的情况下,require()require_once() 没有混合。我认为这是由符号链接引起的)。
    • 如果您需要class_exists,您可能可以使用更好的自动加载器。 class_exists,除非另有说明,否则会调用自动加载程序,该自动加载程序会在整个包含路径中查找文件。如果找不到,class_exists 返回 false。如果您需要手动包含/要求文件,那么您可能做错了什么。我从事大型项目(通常超过 100 万个 LoC),我从不在测试之外使用 requirerequire_once...
    【解决方案3】:

    这意味着您已经声明了类数据库,第二次加载它(无论副本在哪里),它都会导致错误。我们看不到您引用的两个文件的内容。但是,我敢肯定,如果您同时查看它们,您会发现至少有两个类数据库的创建。需要删除一个。

    【讨论】:

    • 所有类都需要主类databse.php
    • 是的,但如果您在主文件中包含 database.php。但也包括在您包含在主文件中的所有其他文件中。这样你就会遇到错误。
    • @AD7six:这就是我们使用自动装载机的原因;-P
    猜你喜欢
    • 1970-01-01
    • 2010-10-17
    • 2014-11-07
    • 2012-07-31
    • 2016-03-25
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多