【问题标题】:PHP interface problem - class not foundPHP接口问题-找不到类
【发布时间】:2011-04-11 21:58:17
【问题描述】:

您好,我有一个实现接口的非常简单的类。类和接口都在同一个文件中。

当我实现接口时,我收到一个致命错误“找不到类”,但是当我删除实现然后尝试使用该类时,我可以正常使用它???

任何人都可以就此提供任何建议吗?

抱歉,这是我目前用来测试的一些代码:

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

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

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

【问题讨论】:

  • 任何代码可以重现错误?
  • 对不起,我已经发布了一些
  • 尝试将类/接口定义放在文件的开头(在使用之前)。

标签: php interface


【解决方案1】:

在定义类和接口之后创建类的实例,而不是之前。

这种情况下的定义顺序应该是:

  1. 接口
  2. 类实例(对象)

【讨论】:

  • 为什么只有在使用接口时才会失败?即当使用普通类和抽象类时,则不存在此问题
  • 虽然这是解决方案(并修复了我遇到的相同问题),但这是定义的行为还是只是 PHP 中的错误?
  • 这是一个愚蠢的 php bug smh,但是是的,这就是解决方案
【解决方案2】:

这是一个(非常糟糕的)记录限制:

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

在某些情况下,必须在使用前声明类。只有在使用 PHP 5 的一些新特性(例如接口)时才会发生这种情况。否则行为是旧的。

尽管如此,我还是提交了错误报告。 IMO 应该修复它,因为它的行为不一致,并且错误消息对任何像我一样假设 PHP 根本不在乎您声明函数/类的位置的人都没有帮助。来吧,它已经存在了 10 多年了...

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

【讨论】:

    【解决方案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...
    

    【讨论】:

      【解决方案4】:

      那是因为,php加载接口,并且实例化类class类对象的地方有一定的顺序,而且必须在一个php文件中,如果文件不按照1.Require_one接口的顺序,2.Require_one类

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-22
        • 1970-01-01
        • 2018-03-14
        • 2012-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多