【问题标题】:Why I am getting "Cannot redeclare class" error?为什么我收到“无法重新声明课程”错误?
【发布时间】:2014-12-31 05:21:02
【问题描述】:

我在端口 81 上运行 Apache。我的项目文件夹是 MyPhpProject。在其中我有 2 个文件夹:域和测试。

Domain 文件夹中,我有 3 个 PHP 文件:

  1. BaseDomain.php 包含一个抽象类 BaseDomain
  2. Lo​​cation.php 包含一个从 BaseDomain 继承的具体类 Location
  3. Employee.php 包含一个从 BaseDomain 继承的具体类 Employee

Employee类有一个Location类的引用。

这是 BaseDomain.php:

<?php
abstract class BaseDomain {

}
?>

这是 Location.php:

<?php
$returnRequire = require 'BaseDomain.php';

class Location extends BaseDomain {

    private $locationIdInt;         
    private $codeNameString;        
    private $descString;        

    public function setLocationId($locationId) {
        $this->locationIdInt = $locationId;
    }
    public function getLocationId() {
        return $this->locationIdInt;
    }

    public function setCodeName($codeName) {
        $this->codeNameString = $codeName;
    }
    public function getCodeName() {
        return $this->codeNameString;
    }

    public function setDesc($desc) {
        $this->descString = $desc;
    }
    public function getDesc() {
        return $this->descString;
    }
}
?>

这是Employee.php:

<?php
$returnRequire = require 'BaseDomain.php';

class Employee extends BaseDomain {

    private $employeeIdString;          
    private $locationObject;            

    public function setEmployeeId($employeeId) {
        $this->employeeIdString = $employeeId;
    }
    public function getEmployeeId() {
        return $this->employeeIdString;
    }

    public function setLocation($location) {
        $this->locationObject = $location;
    }
    public function getLocation() {
        return $this->locationObject;
    }
}
?>

现在在 Testing 文件夹中,我创建了一个 Test_Employee.php,这是它的代码:

<?php
set_include_path('../Domain');

$getIncludePath = get_include_path();
echo "getIncludePath = " . $getIncludePath;
echo "<br>";

$returnRequire1 = require 'Location.php';
echo "returnRequire for Location.php = " . $returnRequire1;
echo "<br>";

$returnRequire2 = require 'Employee.php';
echo "returnRequire for Employee.php = " . $returnRequire2;
echo "<br>";
?>

当我尝试运行它http://localhost:81/MyPhpProject/Testing/Test_Employee.php 时,我收到一个关于无法重新声明 BaseDomain 类的致命错误。这是我在浏览器中看到的:

getIncludePath = ../域

returnRequire for Location.php = 1

致命错误:无法在 C:\Program Files 中重新声明类 BaseDomain (x86)\Apache 软件 Foundation\Apache2.2\htdocs\MyPhpProject\Domain\BaseDomain.php 上线 2

我没有多次创建 BaseDomain 类。所以这个错误很奇怪。有人可以解释为什么我收到错误消息吗?以及如何解决它。

感谢您的宝贵时间。

【问题讨论】:

  • 使用 require_once 代替 require。
  • 简单 - 您使用的是 require 而不是 require_oncephp.net/manual/en/function.require-once.php
  • 确实如此。在Test_Employee.php 中,您定义了两次,一次是需要Location.php,需要BaseDomain.php,一次是需要Employee.php,需要BaseDomain.php。这正是 require_once (将跳过第二个要求)旨在修复的那种事情。把你的 PHP 程序想象成一个由所有包含的文件组合在一起的大文件;这就是它的工作原理。
  • 即使在 Test_Employee.php 中,当我从 require 更改为 require_once 时,我仍然收到相同的错误消息。

标签: php


【解决方案1】:

$returnRequire1 = require 'Location.php'; 行加载 Location.php,而后者又在$returnRequire = require 'BaseDomain.php'; 行中加载 BaseDomain.php。然后,$returnRequire2 = require 'Employee.php'; 行加载 Employee.php,它(再次)加载 BaseDomain.php($returnRequire = require 'BaseDomain.php'; 行)。 BaseDomain.php 的第二次加载导致 php 尝试重新定义 BaseDomain 类,这是不允许的。

解决此问题的最简单方法是将您的require 调用更改为require_once。这将确保每个文件在每次运行时只加载一次,从而避免您遇到的错误。

【讨论】:

  • 您的意思是在所有 PHP 文件中使用 require_once
  • 是的。您应该在整个 php 文件中将每次出现的 require 更改为 require_once(有一些例外,但我们不会在这里讨论)。
【解决方案2】:

BaseDomain.php:

<?php
abstract class BaseDomain {

}
?>

位置.php

<?php
class Location extends BaseDomain {

    private $locationIdInt;         
    private $codeNameString;        
    private $descString;        

    public function setLocationId($locationId) {
        $this->locationIdInt = $locationId;
    }
    public function getLocationId() {
        return $this->locationIdInt;
    }

    public function setCodeName($codeName) {
        $this->codeNameString = $codeName;
    }
    public function getCodeName() {
        return $this->codeNameString;
    }

    public function setDesc($desc) {
        $this->descString = $desc;
    }
    public function getDesc() {
        return $this->descString;
    }
}
?>

Employee.php:

<?php

class Employee extends BaseDomain {

    private $employeeIdString;          
    private $locationObject;            

    public function setEmployeeId($employeeId) {
        $this->employeeIdString = $employeeId;
    }
    public function getEmployeeId() {
        return $this->employeeIdString;
    }

    public function setLocation($location) {
        $this->locationObject = $location;
    }
    public function getLocation() {
        return $this->locationObject;
    }
}
?>

Test_Employee.php

<?php
set_include_path(__DIR__.'/MyPhpProject/Domain');
require 'BaseDomain.php';

$getIncludePath = get_include_path();
echo "getIncludePath = " . $getIncludePath;
echo "<br>";

$returnRequire1 = require 'Location.php';
echo "returnRequire for Location.php = " . $returnRequire1;
echo "<br>";

$returnRequire2 = require 'Employee.php';
echo "returnRequire for Employee.php = " . $returnRequire2;
echo "<br>";
?>

【讨论】:

  • 所以您已经从 Location.php 和 Employee.php 中删除了 require 语句。但是这些类中的每一个都需要 BaseDomain.php,因为它们都继承自 BaseDomain。当我从 Location.php 中删除 require 语句,然后尝试访问它http://localhost:81/MyPhpProject/Domain/Location.php 时,我收到以下错误消息:> 致命错误:C:\Program Files (x86)\Apache Software Foundation\Apache2 中找不到类“BaseDomain” .2\htdocs\MyPhpProject\Domain\Location.php 在第 2 行
  • 编辑 set_include_path('../Domain'); to set_include_path(_ DIR _'/MyPhpProject/Domain');
  • 问题是我现在无法访问 Location.php 和 Employee.php,因为您在这两个文件中删除了 $returnRequire = require 'BaseDomain.php'; 这一行。试试http://localhost:81/MyPhpProject/Domain/Location.phphttp://localhost:81/MyPhpProject/Domain/Employee.php,你会得到一个致命的错误信息:Class 'BaseDomain' not found。
  • BaseDomain.php, Location.php,Employee.php sava 到 MyPhpProject/Domain 目录。请将 Test_Employee.php 移至 htdocs 和 localhost:81/Test_Employee.php cal url。对不起,我的英语不是上帝。
  • 更改后,对 Test_Employee.php 的调用现在可以正常工作了。但是对 Location.php 的调用不再起作用。并且对 Employee.php 的调用也不再起作用了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-18
相关资源
最近更新 更多