簡體   English   中英

所有測試都因PHP致命錯誤而失敗:無法重新聲明課程

[英]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之間的某個錯誤。

然而,快速和骯臟的解決方案似乎是:

  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 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM