【问题标题】:PHP class not found in autoloaded implementation file在自动加载的实现文件中找不到 PHP 类
【发布时间】:2012-01-30 13:13:48
【问题描述】:

我真的希望这不是重复的,但我开始了:

我使用 Zend 的自动加载器来加载类。它似乎有效,至少它在实例化我的类(Common_TestTest)时加载了正确的文件,该类在 Common/TestTest.php 中实现。但随后我收到以下错误消息:

“在 Common/TestTest.php 中找不到类 Common_TestTest。”

TestTest.php 中除了类之外什么都没有:

<?php

class Common_TestTest extends PHPUnit_Framework_TestCase
{
    public function testTesting() {
        $this->assertTrue(true);
        $this->assertFalse(true);
    }
}

我尝试在文件末尾转储get_declared_classes,一切看起来都很好,Common_TestTest 是声明的类之一 - 但离开文件时仍然抛出异常。

最有趣的是:当我将类的名称从 Common_TestTest 更改为 TestTest 时,会发生同样的事情 - 只是错误消息将缺少的类的名称声明为 "TestTest"。所以它肯定会看到班级并对它的存在做出反应。

【问题讨论】:

  • 除了命名空间之外:哪个组件给你的错误信息?是禅德吗?消息指向哪个目录?这是一条相对路径而不是绝对路径,所以这会很有趣。如果自动加载器在错误的目录中查找,则找不到该文件。
  • 这显然是一个测试类。它是存储在应用程序/Common 中还是存储在 Test FIles/Common 中?如果它在 Testing Files/Common 中,您可能在引导测试套件时遗漏了路径。
  • 这里自动加载应该无关紧要,因为默认情况下,PHPUnit 通过扫描目录以查找以Test.php 结尾的文件来加载所有测试用例。事实上,我会避免使用自动加载器注册包含测试的目录。

标签: php zend-framework phpunit zend-autoloader


【解决方案1】:

关于导致问题的原因,我想到了两种可能性:

  1. 类名和文件名之间存在一些大小写不匹配的情况,例如测试测试.php

  2. 注册命名空间时,您使用“Common”而不是“Common_”。 Zend_Loader_Autoloader 不区分 PHP 5.3 风格的命名空间和 ZF 风格的命名空间(而是前缀)。通过附加下划线,您可以确保您的命名空间被解释为类前缀而不是真正的命名空间。

【讨论】:

    猜你喜欢
    • 2016-05-06
    • 1970-01-01
    • 2018-11-26
    • 2014-06-16
    • 1970-01-01
    • 2013-10-18
    • 2020-11-03
    • 2019-05-16
    • 1970-01-01
    相关资源
    最近更新 更多