1

我注意到添加我需要的文件夹的包含路径不足以访问这些类。

我有一个文件夹 application/tests/ 其中包含 application/tests/Test.php

类 Test.php 被命名为 Test 没有任何前缀

class Test {

}

如果我仅在包含路径中添加测试文件夹

realpath(APPLICATION_PATH . '/tests')

类 Test.php 在控制器中不起作用

new Test()

那么在包含路径中包含文件夹还不够吗?

4

2 回答 2

2

包含路径显示 PHP 将在何处查找将要包含的脚本 - 因此当您说include('blah.php')PHP 引擎将blah.php在包含路径中的所有路径中查找时。

自动加载是允许在 PHP 检测到需要但未定义类时调用某些函数的功能。在此函数中,您可以使用包含路径找到包含该类的文件并加载它,但这些是完全不同的东西。

realpath()与其中任何一个都不相关,并且是一个函数,它返回给定文件的唯一文件系统路径,..并解析符号链接之类的东西。

于 2010-12-11T04:08:30.257 回答
2

@StasM 是对的。但这里有更多的解释。

告诉 PHP在include_path执行 an include、 an include_once、 arequire或 a时到哪里查看require_once。当然,这些includes 和requires 总是引用一个特定的文件

自动加载专门针对缺少的。当在代码中引用尚未加载的类时 - 通常,但不限于,通过调用new运算符,如在您的示例中 - 然后自动加载是一个可以使用用于加载类的算法的过程。这个过程通常涉及从丢失的类的名称开始,并从丢失的类的名称中生成一个可能的路径名集合——文件系统中的绝对路径名或相对于条目中的条目,include_path然后执行一个include以希望该类定义存在于其中之一。

在您的情况下,您已经调用了一个名为“Test”的类。包含此类的文件位于文件中APPLICATION_PATH . 'tests/Test.php'。并且您已将目录APPLICATION_PATH . 'tests'放在include_path. 但在有一个自动加载算法到位之前,系统无法将类名连接'Test'到文件名'Test.php'

PEAR 风格的类名约定将提供这种连接。使用该约定的自动加载器(如默认的 Zend Framework 自动加载器)将能够执行从类名到文件名的映射,然后include是所需的文件。

最后一个复杂的问题是,传统的 Zend Framework 目录布局约定将某些类放在不在包含路径上的文件夹中模型、表单、服务、控制器、视图助手、动作助手等。这就是为什么您经常会看到更多配置自动加载器 - 通常在Bootstrap类中 - 定义某些类名和文件系统中某些位置之间的映射,这些位置不在include_path.

例如,一个名为“Default_Model_User”的类可能——乍一看——应该驻留在include_path文件中'Default/Model/User.php'。但是标准的应用程序目录结构希望将该文件放在“application/models/User.php”中。注意路径名中的复数“models”和小写的“m”,以及类名中“Default”的存在。为了理解这一点,需要在自动加载器上进行额外配置,为类名到文件名映射提供模式。这通常通过资源自动加载器来完成。

希望这对您或其他人有所帮助。干杯!

于 2010-12-11T14:22:15.893 回答