Php 从性能角度看,注册表模式对于类实例化更有效还是自动加载?

Php 从性能角度看,注册表模式对于类实例化更有效还是自动加载?,php,design-patterns,Php,Design Patterns,在注册表模式中,我们只创建我们需要的对象,例如: public function createAndStoreObject( $object, $key ) { require_once( $object . '.class.php' ); $this->objects[ $key ] = new $object( $this ); } 然后通过其密钥访问它。 在autoloader中,我们执行以下操作: <?php class a

在注册表模式中,我们只创建我们需要的对象,例如:

public function createAndStoreObject( $object, $key )
    {
        require_once( $object . '.class.php' );
        $this->objects[ $key ] = new $object( $this );
    }
然后通过其密钥访问它。
在autoloader中,我们执行以下操作:

<?php

class autoloader {

        public static function moduleautoloader($class) {
                $path = $_SERVER['DOCUMENT_ROOT'] . "/modules/{$class}.php";
                if (is_readable($path)) {
                        require $path;
                }
        }

        public static function daoautoloader($class) {
                $path = $_SERVER['DOCUMENT_ROOT'] . "/dataobjects/{$class}.php";
                if (is_readable($path))
                        require $path;
        }

        public static function includesautoloader($class) {
                $path = $_SERVER['DOCUMENT_ROOT'] . "/includes/{$class}.php";
                if (is_readable($path))
                        require $path;
        }

}
spl_autoload_register('autoloader::includesautoloader');
spl_autoload_register('autoloader::daoautoloader');
spl_autoload_register('autoloader::moduleautoloader');
?>

然后按如下方式使用:

当我们想要创建一个对象时,它应该通过includes、modules或dataobjects文件夹来查找该类,然后如果它存在,就应该创建该对象。

对于一个庞大的应用程序,我们必须使用注册表方法还是使用autoloader有一些好处?

使用
require\u once
可以说比自动加载要快,特别是当它只被调用一次时

但是有了自动加载器,您就不用显式加载所有需要的类了,它就在那里。而且它是按需提供的,因此如果您决定更改代码并且不再需要某个特定的类,则不必记住停止包含类定义文件

顺便说一句,根据您的代码,我建议将它们放入一个自动加载程序功能中:

function my_autoload($class) {
    static $docroot = $_SERVER['DOCUMENT_ROOT'];

    // alternative to goto block
    do {
        $path = "$docroot/modules/$class.php";
        if (file_exists($path)) {
            break;
        }
        $path = "$docroot/dataobjects/$class.php";
        if (file_exists($path)) {
            break;
        }
        $path = "$docroot/daoobjects/$class.php";
        if (file_exists($path)) {
            break;
        }
        // we can't find the file, so return
        return;
    } while (false);
    // a path exists, so load it
    require_once($path);
}

spl_autoload_register('my_autoload');
这将比有三个单独的功能更好一些


<> >为了提高效率,可以考虑使用命名空间;它们形成了一个逻辑目录结构,使自动加载程序变得更简单。

使用
require\u once
可以说比自动加载要快,特别是当它只被调用一次时

但是有了自动加载器,您就不用显式加载所有需要的类了,它就在那里。而且它是按需提供的,因此如果您决定更改代码并且不再需要某个特定的类,则不必记住停止包含类定义文件

顺便说一句,根据您的代码,我建议将它们放入一个自动加载程序功能中:

function my_autoload($class) {
    static $docroot = $_SERVER['DOCUMENT_ROOT'];

    // alternative to goto block
    do {
        $path = "$docroot/modules/$class.php";
        if (file_exists($path)) {
            break;
        }
        $path = "$docroot/dataobjects/$class.php";
        if (file_exists($path)) {
            break;
        }
        $path = "$docroot/daoobjects/$class.php";
        if (file_exists($path)) {
            break;
        }
        // we can't find the file, so return
        return;
    } while (false);
    // a path exists, so load it
    require_once($path);
}

spl_autoload_register('my_autoload');
这将比有三个单独的功能更好一些


<> >为了提高效率,可以考虑使用命名空间;它们形成了一个逻辑目录结构,使自动加载器的制作更加简单。

我认为您混淆了这两种模式的目的:注册表模式的目的是实例化对象;自动加载程序的目的是在
Pro-PHP设计模式
一书中包含适当的脚本文件。我看到上面的slurp代码只是用来创建对象的;自动加载程序的目的是在
Pro-PHP设计模式
一书中包含适当的脚本文件。我看到了上面的slurp代码,它只是用来创建对象。为什么速度更快?spl_autoload_register()是否会占用更多内存?@因为autoload必须查找类和相关文件名并需要它。手动要求该文件可以节省查找时间。为什么速度更快?spl_autoload_register()是否会占用更多内存?@因为autoload必须查找类和相关文件名并需要它。手动要求该文件将节省查找时间。