Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用zend framework类名称空间自动加载文件_Php_Zend Framework_Autoload - Fatal编程技术网

Php 如何使用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方式加载类文件 这是我的

我正在从头开始开发一个新的应用程序,我需要递归地自动加载文件。 但是,我需要使用像Zend Framework这样的名称空间

例如,
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加载器实现,但它现在帮不了我!