我注意到添加我需要的文件夹的包含路径不足以访问类。
我有一个文件夹application / tests /,其中包含application / tests / Test.php
类Test.php名为Test,没有任何前缀
class Test {
}
如果我只在include路径中添加tests文件夹
realpath(APPLICATION_PATH . '/tests')
类Test.php在控制器中不起作用
new Test()
所以不包括include路径中的文件夹吗?
答案 0 :(得分:2)
包含路径显示PHP将查找要包含的脚本的位置 - 这样当您说include('blah.php')
时,PHP引擎会在包含路径中的所有路径中查找blah.php
。
自动加载功能允许在PHP检测到需要但未定义类时调用某些函数。在这个函数中,你可以使用include路径来查找包含类的文件并加载它,但这些是完全不同的东西。
realpath()
与其中任何一个都无关,它是一个返回给定文件的唯一文件系统路径的函数,其中包括..
和符号链接等。
答案 1 :(得分:2)
@StasM没错。但这里有一点解释。
include_path
告诉PHP在执行include
,include_once
,require
或require_once
时的位置。当然,这些include
和require
始终引用特定的文件。
自动加载专门针对缺少类。在代码中引用尚未卸载的类时 - 通常(但不是唯一地)通过调用new
运算符(如示例中所示) - 然后自动加载是一个可以使用加载类的算法启动的过程。此过程通常涉及从缺少的类的名称开始,并从缺少的类的名称生成可能的路径名的集合 - 文件系统中的绝对路径或相对于include_path
中的条目 - 然后执行{ {1}}希望类定义存在于其中一个中。
在您的情况下,您已经调用了一个名为“Test”的类。包含此类的文件驻留在文件include
中。您已将目录APPLICATION_PATH . 'tests/Test.php'
放在APPLICATION_PATH . 'tests'
中。但是,在有自动加载算法之前,系统无法将类名include_path
连接到文件名'Test'
。
PEAR-style class name convention将提供此连接。使用该约定的自动加载器(如默认的Zend Framework自动加载器)将能够执行从类名到文件名的映射,然后'Test.php'
所需的文件。
作为最终的复杂功能,传统的Zend Framework目录布局约定将某些类放在包含路径上 NOT 的文件夹中:模型,表单,服务,控制器,视图助手,操作帮助程序等这就是为什么你经常会看到自动加载器的更多配置 - 通常在include
类中 - 定义某些类名与文件系统中 off {{1}的某些位置之间的映射。 }。
例如,名为“Default_Model_User”的类可能 - 乍一看 - 应该驻留在文件Bootstrap
中的include_path
上。但是标准的app目录结构想要将该文件放在'application / models / User.php'中。请注意路径名中的复数'models'和小写'm',以及类名中是否存在“Default”。为了理解这一点,需要自动加载器上的额外配置,为类名到文件名映射提供模式。这通常使用resource autoloader完成。
希望这对你或其他人有帮助。干杯!