2010-09-13 25 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