本文目录一览:
- PHP中如何用autoload($class) 实现Lib目录下的类的自动加载并可以兼容子目录?
- 请问怎样用js,php等网页技术实现页面自动加载。
- 详解PHP文件的自动加载(autoloading)
- 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 文件时,需要在文档头部使用 require
或 include
:
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.php
和 autoload_static.php
。
执行 composer dump-autoload --optimize
可优化项目的自动加载速度。
PSR-0(已弃用)
"psr-0": {"Mockery": "library/"}
写入 /composer/autoload_namespaces.php
,虽然官方已弃用,但 Laravel 一些组件包仍在使用。
注:
autoload_static.php
包含了四个文件的全部映射,这里不做详细介绍。