gpt4 book ai didi

php - 所有测试均失败并出现 PHP fatal error : cannot redeclare class

转载 作者:搜寻专家 更新时间:2023-10-31 20:38:03 24 4
gpt4 key购买 nike

我发现 PHPUnit 有一个奇怪的行为,我无法确定是我做错了什么,还是测试框架的错误。这是我的案例:

我的项目有几个类:BsInput、BsEmail、BsHidden、BsNumber。 BsEmail、BsHidden 和 BsNumber 扩展 BsInput。所有类都有单元测试类(BsInput 为 BsInputTest,BsEmail 为 BsEmailTest 等)。

单独执行的每个单元测试都很好。

现在,如果我尝试在我的项目中运行所有测试,我会收到一条错误消息“PHP fatal error :无法在第 80 行的/some/path/to/B.php 中重新声明类 B”。

这是每个文件的内容:

BsInput.php

require_once __DIR__ . "/BsInputControl.php";

class BsInput extends BsInputControl {
...
}

BsEmail.php

require_once __DIR__ . "/BsInput.php";

class BsEmail extends BsInput {
...
}

BsHidden.php

require_once __DIR__ . "/BsInput.php";

class BsHidden extends BsInput {
...
}

BsNumber.php

require_once __DIR__ . "/BsInput.php";

class BsNumber extends BsInput {
...
}

BsInputTest.php

require_once "../colibri/bs/BsInput.php";

class BsInputTest extends PHPUnit_Framework_TestCase {
...
}

BsEmailTest.php

require_once "../colibri/bs/BsEmail.php";

class BsEmailTest extends PHPUnit_Framework_TestCase {
...
}

BsHiddenTest.php

require_once "../colibri/bs/BsHidden.php";

class BsHiddenTest extends PHPUnit_Framework_TestCase {
...
}

BsNumberTest.php

require_once "../colibri/bs/BsNumber.php";

class BsNumberTest extends PHPUnit_Framework_TestCase {
...
}

现在最后一件让我发疯的小事:如果我注释掉 BsHidden.php 和 BsHiddenTest.php 中的所有代码,PHPUnit All Tests 的执行会在 BsNumber 和后续类上顺利进行!

有没有人见过类似的东西?有什么线索可以解决我的问题吗?

我尝试了一个丑陋的解决方法:在 BsInput.php 中插入以下代码

var_dump(class_exists('BsInput', FALSE));
if (class_exists('BsInput', FALSE)) { return; }

我得到了这个结果:

bool(true)
PHP Fatal error: Cannot redeclare class BsInput in /.../BsInput.php on line 87

到目前为止,我已经研究了很多问题,包括上述问题,但到目前为止我找不到任何解决方案。

我也曾尝试将 PHPUnit 更新到最新版本 (4.6),但没有成功。

我的平台是:苹果操作系统 X 10.10PHP 5.5.20PHPUnit 4.6.6Netbeans 8.0.2(如果有任何相关的)

有什么线索吗?

在尝试解决这个问题后,我终于删除了我的 BsHidden.php 文件,附加的测试文件并重新创建它们(我的意思是我复制/粘贴的内容完全相同)......现在它有效!这真的让我想到了 PHP 和 PHPUnit 之间的错误。

然而,一个快速而肮脏的解决方法似乎是:

  1. 将文件和单元测试文件内容复制粘贴到另一个文件
  2. 删除有问题的文件和单元测试文件(如果有的话)
  3. 重新创建文件和单元测试文件并粘贴内容

最佳答案

我终于确定了我的问题。似乎有一个 PHP 错误,至少在我的平台上是这样。

PHP 手册说 ( http://php.net/manual/en/function.include-once.php ) PHP4 中的名称解析在不区分大小写的系统上不区分大小写,而 PHP5 会处理此类问题。

这是我在我的平台(Mac OS X 10.10,PHP 5.5)上得到的行为:

假设我有一个 A.php 文件,它定义了一个 A 类和以下代码:

<?php
require_once 'A.php';
require_once 'a.php';
?>

第二个 require_once 触发了 Can not redeclare class 错误。因此,在 Mac OS X 上的 PHP5.5 中,至少名称解析是不区分大小写的,但无论如何 PHP 仍然认为它们是不同的文件

关于php - 所有测试均失败并出现 PHP fatal error : cannot redeclare class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30414094/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com