Php 如何使用zend framework类名称空间自动加载文件
我正在从头开始开发一个新的应用程序,我需要递归地自动加载文件。 但是,我需要使用像Zend Framework这样的名称空间 例如,Php 如何使用zend framework类名称空间自动加载文件,php,zend-framework,autoload,Php,Zend Framework,Autoload,我正在从头开始开发一个新的应用程序,我需要递归地自动加载文件。 但是,我需要使用像Zend Framework这样的名称空间 例如,LibraryName\u Http\u Request将加载LibraryName/Http/Request.php文件。 无论我尝试过什么,如果我命名文件LibraryName\u Http\u Request.php,我只能使用LibraryName\u Http\u Request类 我不知道如何更改我的代码,以便可以以相同的Zend方式加载类文件 这是我的
LibraryName\u Http\u Request
将加载LibraryName/Http/Request.php
文件。
无论我尝试过什么,如果我命名文件LibraryName\u Http\u Request.php
,我只能使用LibraryName\u Http\u Request
类
我不知道如何更改我的代码,以便可以以相同的Zend方式加载类文件
这是我的密码:
class Autoloader
{
public function __construct()
{
spl_autoload_register( array( $this, 'autoload' ) );
}
public function autoload( $class )
{
$iterator = new RecursiveDirectoryIterator( LIBRARY_PATH );
foreach( new RecursiveIteratorIterator( $iterator ) as $file=>$meta ) {
if( ( $class . '.php' ) === $meta->getFileName() ) {
if( file_exists( $file ) ) {
require_once $file;
}
break;
}
}
unset( $iterator, $file );
}
}
你应该看看你想要的是什么。您可以在建议的末尾找到指向的链接
更新:由于您使用的是PHP5.2,上述加载程序并不完全适合您的需要。下面是我基于PSR-0编写的一个简单的自动加载器,它不支持名称空间:
class SimpleClassLoader
{
/**
* Installs this class loader on the SPL autoload stack.
*/
public function register()
{
spl_autoload_register(array($this, 'loadClass'));
}
/**
* Uninstalls this class loader from the SPL autoloader stack.
*/
public function unregister()
{
spl_autoload_unregister(array($this, 'loadClass'));
}
/**
* Loads the given class or interface.
*
* @param string $className The name of the class to load.
* @return void
*/
public function loadClass($className)
{
require str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
}
}
然后注册加载程序:
$loader = new SimpleClassLoader();
$loader->register();
现在,参考LibraryName\u Http\u请求
将包括LibraryName/Http/Request.php
您应该检查您想要的是什么。您可以在建议的末尾找到指向的链接
更新:由于您使用的是PHP5.2,上述加载程序并不完全适合您的需要。下面是我基于PSR-0编写的一个简单的自动加载器,它不支持名称空间:
class SimpleClassLoader
{
/**
* Installs this class loader on the SPL autoload stack.
*/
public function register()
{
spl_autoload_register(array($this, 'loadClass'));
}
/**
* Uninstalls this class loader from the SPL autoloader stack.
*/
public function unregister()
{
spl_autoload_unregister(array($this, 'loadClass'));
}
/**
* Loads the given class or interface.
*
* @param string $className The name of the class to load.
* @return void
*/
public function loadClass($className)
{
require str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
}
}
然后注册加载程序:
$loader = new SimpleClassLoader();
$loader->register();
现在引用
LibraryName\u Http\u Request
将包括LibraryName/Http/Request.php
,在某个时候,您需要用目录分隔符替换下划线。为什么不想使用Zend\u Loader\u Autoloader
并注册所需的名称空间?b.b3rn4rd-我不能在项目@迈克B-我尝试了很多方法来替换文件,但都没有成功!您可以使用Composer附带的自动加载系统,它很轻,您可以将其减少两个文件以满足您的需要。我已经更新了我的答案。现在是否满足您的需要?在某个时候,您需要用目录分隔符替换下划线。为什么您不想使用Zend_Loader\u Autoloader
并注册所需的名称空间?b.b3rn4rd-我不能在项目中使用任何其他库@迈克B-我尝试了很多方法来替换文件,但都没有成功!您可以使用Composer附带的自动加载系统,它很轻,您可以将其减少两个文件以满足您的需要。我已经更新了我的答案。现在它符合你的需要吗?我删除了我的答案-这一个更好,并且有更多新的建议。PSR-0是一堆废话@我不同意你的看法。我很乐意阅读你的意见,而不是安东尼·费拉拉的意见。是的,PSR-0并不完美,但当与类映射自动加载程序结合使用时,您几乎可以加载每个PHP项目中的每个类。如果你不喜欢我的答案,请随时发布你的答案。告诉我我是否错了,但是(你的框架)reefknot的autoloader是PSR-0兼容的,对吗?@Florent文件结构中的类的组织类似于PSR-0(并且它可能与PSR-0加载程序一起工作),但在PSR-0下组织类的方式不是问题,而是一个合理的模式。问题是它试图做的太多,不能正确地处理边缘情况(正如Anthony所说),而且它当然不应该出错,因为它无法加载类!我的自动加载器在默认情况下根本没有设置为处理uu名称空间(尽管您可以配置它的实例来处理它)。@Florent我没有使用PHP5.3。。。而且还停留在PHP5.2中,这就是我创建上面发布的类的原因。我已经在使用PSR-0加载器实现,但它现在帮不了我!我删除了我的答案-这一个更好,并且有更多新的建议。PSR-0是一堆废话@我不同意你的看法。我很乐意阅读你的意见,而不是安东尼·费拉拉的意见。是的,PSR-0并不完美,但当与类映射自动加载程序结合使用时,您几乎可以加载每个PHP项目中的每个类。如果你不喜欢我的答案,请随时发布你的答案。告诉我我是否错了,但是(你的框架)reefknot的autoloader是PSR-0兼容的,对吗?@Florent文件结构中的类的组织类似于PSR-0(并且它可能与PSR-0加载程序一起工作),但在PSR-0下组织类的方式不是问题,而是一个合理的模式。问题是它试图做的太多,不能正确地处理边缘情况(正如Anthony所说),而且它当然不应该出错,因为它无法加载类!我的自动加载器在默认情况下根本没有设置为处理uu名称空间(尽管您可以配置它的实例来处理它)。@Florent我没有使用PHP5.3。。。而且还停留在PHP5.2中,这就是我创建上面发布的类的原因。我已经在使用PSR-0加载器实现,但它现在帮不了我!