2010-09-13 27 views
11

嗨我有一個非常簡單的類,實現一個接口。類和接口都在同一個文件中。PHP接口問題 - 類沒有找到

當我實現接口時,我得到一個致命的錯誤「Class not found」,但是當我刪除了implements並嘗試使用該類時,我可以使用它很好嗎?

任何人都可以提供任何意見嗎?

對不起這裏是一些代碼,我使用的時刻來測試:

$tester = new TypeOneTester(); 
$tester->test("Hello"); 

interface iTestInterface 
{ 
    public function test($data); 
} 

class TypeOneTester implements iTestInterface 
{ 
    public function test($data) 
    { 
     return $data; 
    } 
} 
+2

任何代碼重現錯誤? – Crozin 2010-09-13 22:20:37

+0

對不起,我現在發佈了一些 – David 2010-09-13 22:25:52

+1

嘗試在文件開始時使用類/接口定義(在使用之前)。 – 2010-09-13 22:28:39

回答

10

類和接口定義後,即可製作類的實例,而不是之前。

定義的這種情況下的順序應爲:

  1. 接口
  2. 實例類的(對象)
+1

爲什麼只有在使用接口時纔會失敗?即當使用普通類和抽象類時,這個問題不存在 – David 2010-09-13 22:28:45

+1

雖然這是解決方案(並解決了我所遇到的同樣的問題),但是這種定義的行爲還是PHP中的一個錯誤? – Brad 2011-04-25 20:52:26

3

聞起來像在PHP的錯誤。確保它是可重現的最新版本併發布到bugs.php.net。

重現代碼

interface I {} 

$a = new A; 
$b = new B; 

class A { 
    function __construct() { echo 'A'; } 
} 

class B implements I { 
    function __construct() { echo 'B'; } 
} 

預期

AB 

實際:

A 
Fatal error: Class 'B' not found... 
2

這是因爲,PHP裝載接口,並實例化類的類的類對象,其中存在一定的順序並且必須位於Php文件中,如果文件不符合1的順序。Require_one interf王牌,2 Require_one類

5

這是一個(很差)記載的限制:

http://php.net/manual/pl/migration5.incompatible.php

在有些情況下類必須在使用前進行聲明。只有在使用PHP 5的某些新功能(例如接口)時纔會發生。否則,行爲是舊的。

我已經提交了一個錯誤報告。 IMO應該修復它,因爲它的行爲不一致,錯誤信息對任何假設我沒有幫助的人都沒有幫助,PHP根本不在乎你聲明函數/類的位置。來吧,它一直在那裏,現在超過10年......

https://bugs.php.net/bug.php?id=69665