php自动加载机制,php框架自动加载

发布时间:2022-12-02

本文目录一览:

  1. PHP中如何用autoload($class) 实现Lib目录下的类的自动加载并可以兼容子目录?
  2. 请问怎样用js,php等网页技术实现页面自动加载。
  3. 详解PHP文件的自动加载(autoloading)
  4. Composer 自动加载原理

PHP中如何用autoload($class) 实现Lib目录下的类的自动加载并可以兼容子目录?

PHP自动加载方法有两种。

第一种方案:使用 __autoload

这个函数较简单,但有一问题没有解决,即在 include 前判断文件是否存在的问题。

set_include_path('aa' . PATH_SEPARATOR . get_include_path());
function __autoload($className)
{
    // 如果加这个检测,因为此文件不在当前目录下,它就会检测不到文件存在,
    // 但 include 是能成功的
    if (file_exists($className . '.php')) {
        include_once($className . '.php');
    } else {
        exit('no file');
    }
}
$a = new Acls();

第二种方案:使用 spl_autoload_register

spl_autoload_register() 是更推荐的方式,支持多个自定义自动加载器。

set_include_path('aa' . PATH_SEPARATOR . get_include_path());
spl_autoload_register();
$a = new Acls();

请问怎样用js,php等网页技术实现页面自动加载。

监听 window.onscroll 事件,当滚动条位置变化时,检查是否已经到达底部,如果是,则使用 AJAX 加载下一页的内容,并添加到列表后面。

// 监听滚动条变化的事件
window.onscroll = function() {
    var body = document.body;
    // 检查滚动条是否已达到底部
    if (body.scrollTop + body.clientHeight == body.scrollHeight) {
        // 如果达到底部,则使用AJAX请求下一页数据
        $.ajax({
            url: '',
            success: function() {
                // 请求完成,将数据添加到列表底部
            }
        });
    }
};

详解PHP文件的自动加载(autoloading)

传统上,在 PHP 中,当我们要用到一个 class 文件时,需要在文档头部使用 requireinclude

require_once('../includes/functions.php');
require_once('../includes/database.php');
require_once('../includes/user.php');

但是一旦要调用的文件多了,就得每次都写一行,不够美观。可以使用 PHP 的魔法函数 __autoload()

function __autoload($class_name)
{
    require "./{$class_name}.php";
}

实际开发中,我们可能会这样使用:

function __autoload($class_name)
{
    $name = strtolower($class_name);
    $path = "../includes/{$name}.php";
    if (file_exists($path)) {
        require_once($path);
    } else {
        die("the file {$class_name} could not be found");
    }
}

__autoload() 只能定义一个函数,多人开发中不够灵活。因此,PHP 推出了 spl_autoload_register(),支持多个自定义自动加载器。

使用示例:

// 使用匿名函数
spl_autoload_register(function($class_name) {
    require_once('...');
});
// 使用全局函数
function Custom()
{
    require_once('...');
}
spl_autoload_register('Custom');
// 使用类的静态方法
class MyCustomAutoloader
{
    static public function myLoader($class_name)
    {
        require_once('...');
    }
}
spl_autoload_register(['MyCustomAutoloader', 'myLoader']);
// 使用对象的方法
class MyCustomAutoloader
{
    public function myLoader($class_name)
    {
        require_once('...');
    }
}
$object = new MyCustomAutoloader;
spl_autoload_register([$object, 'myLoader']);

值得一提的是,使用 autoload 机制是 lazy loading,只有在使用类时才会加载对应的文件。 Laravel 和其他框架也广泛使用 spl_autoload_register(),例如:

/**
 * Prepend the load method to the auto-loader stack.
 *
 * @return void
 */
protected function prependToLoaderStack()
{
    spl_autoload_register([$this, 'load'], true, true);
}

Composer 自动加载原理

实现自动加载的过程可分为三步:

文件预加载

框架启动时便被 include,通常提供一些常用函数,如 dd()

"files": ["src/Illuminate/Foundation/helpers.php"]

写入 /composer/autoload_files.php,直接映射文件真实路径,效率最高。

Classmap

"classmap": ["hamcrest"]

写入 /composer/autoload_classmap.php,当使用 use Hamcrest\\Arrays\\IsArray; 时,可直接在 classmap 的数组中找到它。

PSR-4

"psr-4": {"App\\": "app/"}

写入 /composer/autoload_psr4.php,只要是 app/ 目录下的文件,且命名空间符合 PSR-4 标准的类文件都能被自动加载。 执行 composer dump-autoload 后,会将通过 PSR-4 规范加载的文件写入 autoload_classmap.phpautoload_static.php。 执行 composer dump-autoload --optimize 可优化项目的自动加载速度。

PSR-0(已弃用)

"psr-0": {"Mockery": "library/"}

写入 /composer/autoload_namespaces.php,虽然官方已弃用,但 Laravel 一些组件包仍在使用。

注:autoload_static.php 包含了四个文件的全部映射,这里不做详细介绍。