[英]All Tests fails with PHP Fatal error: cannot redeclare class
我在使用PHPUnit时遇到了一个奇怪的行为,我无法确定我是在做错了什么,或者它是否是测试框架中的错误。 这是我的情况:
我的项目有几个类:BsInput,BsEmail,BsHidden,BsNumber。 BsEmail,BsHidden和BsNumber扩展了BsInput。 所有类都有单元测试类(BsInputTest用于BsInput,BsEmailTest用于BsEmail等)。
单独执行的每个单元测试都可以。
现在,如果我尝试在我的项目中运行所有测试,我会收到错误消息“PHP致命错误:无法在第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),但没有成功。
我的平台是:Mac OS X 10.10 PHP 5.5.20 PHPUnit 4.6.6 Netbeans 8.0.2(如果这有任何相关的)
有人知道吗?
在尝试解决这个问题后,我终于删除了我的BsHidden.php
文件,附带的测试文件并完全重新创建它们(我的意思是完全相同的内容我复制/粘贴)......现在它可以了! 这真的让我想到PHP和PHPUnit之间的某个错误。
然而,快速和肮脏的解决方案似乎是:
我终于确定了我的问题。 似乎有一个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 error
。 所以在Mac OS X上的PHP5.5中,至少名称解析不区分大小写, 但PHP仍然认为它们是不同的文件 。
你只是使用class_exists
,像这样使用它:
if (!class_exists('BsInput', FALSE)) {
class BsInput extends BsInputControl {
// ToDo
}
}
我不知道为什么,否则产生这个错误-你到处使用require_ 一次明确?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.