Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 致命错误:无法重新声明类数据库_Php_Oop - Fatal编程技术网

Php 致命错误:无法重新声明类数据库

Php 致命错误:无法重新声明类数据库,php,oop,Php,Oop,我收到一条错误消息,上面说: 致命错误:无法在第3行的C:\wamp\www\pets\u new\lib\Database.php中重新声明类数据库 并且都连接到数据库类 类消息 <?php require('database.php'); class Message{ 这意味着您已经声明了类数据库,第二次加载时(无论副本在哪里),它都会导致错误。我们无法看到您引用的两个文件的内容。但是,我确信如果您同时查看这两个类,您会发现至少有两个类数据库的创建。需要删除一个。在一次“运行”中

我收到一条错误消息,上面说:

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

并且都连接到数据库类

类消息

<?php

require('database.php');

class Message{

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

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

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

class Message
{}
class Database
{}//required by message.php
class User
{}
class Database
{}//required by user.php
正如您所看到的,类
数据库
声明了两次,因此出现了错误。
现在,一个快速修复方法可以取代
require('database.php')包含以下内容的语句:

require_once 'database.php';
检查该特定文件以前是否未包含/需要。如果以前包含/要求过,PHP将不再需要它。
一个更明确、更好的解决方案是注册一个autoloader函数/类方法,并让代码处理业务


更多关于如何注册自动加载器的信息。如果沿着这条路线走下去,您可能会想看看有关类名和名称空间的编码标准。如果您符合这些标准,就不必编写自己的自动加载器,只需使用Symfony2的通用类加载器,或订阅PHP-FIG标准的任何其他框架(如CodeIgnitor、Zend、Cake…您可以随意命名)

在声明类的同时尝试这样做

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

您的两行代码片段不是
database.php
,是吗?它们中的每一个类都包含这一行require_once(“lib/database.php”);检查user.php或message.php文件内部。您已经包含了一个database.php文件,其中已经声明了类database。所有类都需要主类database.phpYes,但是如果您在主文件中包含database.php。但也包括在主文件中包含的所有其他文件中。这样会出现错误。@AD7six:这就是我们使用自动加载器的原因-P@EliasVanOotegem似乎有时候你需要。我刚刚遇到过这样一个案例,所以这对我很有帮助(不,在我的案例中,没有混合使用
require()
require\u once()
。我认为这是由符号链接引起的)。如果你需要
类\u exists
,你可能需要一个更好的自动加载器<代码>class_exists
,除非另有规定,否则会调用自动加载程序,该程序在包含路径中查找文件。如果找不到这些值,
class\u存在
返回false。如果您需要手动包含/需要文件,则可能是您做错了什么。我从事大型项目(通常在100万LoC以北),在测试之外,我从不使用
require
require\u一次。。。
require_once 'database.php';
if(  !class_exists('database') ) {
    require('database.php');
}