[英]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.