php __autoload
来源:互联网 发布:淘宝联盟怎么发布产品 编辑:程序博客网 时间:2024/06/06 07:00
本文目的
本文简要的描述了PHP提供的autoload机制,以及在scake中使用实践。用于减少不必要的文件包含,提高php系统性能。
什么是__autoload
php是脚本语言,不同于c++只需要编译一次,php每次执行过程中都需要编译,所以提高php编译效率,可以提高php脚本执行速度。
每次,当你使用一个新的类时,你需要包含这个类文件,然后在new出这个类。当一个脚本中依赖了很多其他脚本中定义的类时,往往脚本的样子如下:
/**
* 文件non_autoload.php
*/
require_once
(‘your/proj/inc/A.php’);
require_once
(‘your/proj/inc/B.php’);
require_once
(‘your/proj/inc/C.php’);
if
(条件A) {
$a
=
new
A();
$b
=
new
B();
$c
=
new
C();
// … 业务逻辑
}
else
if
(条件B) {
$a
= newA();
$b
=
new
B();
// … 业务逻辑
}
这样就会有一个问题:如果脚本执行“条件B”这个分支时,C.php这个文件其实没有必要包含。因为,任何一个被包含的文件,无论是否使用,均会被php引擎编译。如果不使用,却被编译,这样可以被视作一种资源浪费。更进一步,如果C.php包含了D.php,D.php包含了E.php。并且大部分情况都执行“条件B”分支,那么就会浪费一部分资源去编译C.php,D.php,E.php三个“无用”的文件。
这时候,可以通过PHP的__autoload方法去除这种浪费,__autoload方法提供一种“lazy load”的机制,当第一次需要使用相关类时调用,这样就不会加载不必要的类。还是通过上面的例子,修改如下:
/**
* 文件autoload_demo.php
*/
function
__autoload(
$className
) {
$filePath
= “your/proj/inc/{
$className
}.php”;
if
(
is_readable
(
$filePath
)) {
require
(
$filePath
);
}
}
if
(条件A) {
$a
=
new
A();
$b
=
new
B();
$c
=
new
C();
// … 业务逻辑
}
else
if
(条件B) {
$a
= newA();
$b
=
new
B();
// … 业务逻辑
}
可以看到,文件开头去掉了连串的require方法,使用了php的魔术方法__autoload替代。该函数的工作原理如下:
当php引擎第一次使用类A,但是找不到时,会自动调用__autoload方法,并将类名“A”作为参数传入。所以,我们需要的做的就是根据类名,找到对应的文件,并包含进来,如果我们的方法也找不到,那么php引擎就会报错。注意,这里可以只用require,因为一旦包含进来后,php引擎再遇到类A时,将不会调用__autoload,而是直接使用内存中的类A,不会导致多次包含。
所以,使用__autoload的关键在于,如何根据类名,找到对应类定义的文件。
但是__autoload不能放在类里面,下面是个错误的示范:
class A{
public function __autoload($name){ $file = realpath(__DIR__).'/'.$name.'.php'; if(file_exists($file)) { require_once($file); if(class_exists($name,false)) { return true; } return false; } return false;}public function vv() {$obj = new MyClass(); // 这个类在另外的文件中echo $obj->getNamespace(); //输出 MyClass;}}$obj = new My();echo $obj->vv(); //输出 MyClass;
上面的代码并不能自动加载MyClass,所以__autoload不能放到类内。放到类内的话,在new没require进来的类的时候,__autoload不会自动运行。而__autoLoad的作用就是在new 没找到的类的时候用autoload加载一下。另外,整个项目中,autoload只能有一个。
- php __autoload
- PHP中的__autoload
- PHP __autoload机制原理
- PHP __autoload 详解
- PHP __autoload()方法详解
- php中__autoload()
- php魔术方法__autoload()
- php 魔法函数 __autoload()
- php魔术方法__autoload()
- PHP __autoload()函数
- PHP __autoload与spl_autoload
- php魔术函数__autoload
- php中__autoload的使用
- PHP函数__autoload()和spl_autoload_register()
- PHP函数: __autoload()和spl_autoload_reigster()
- php中__autoload()方法详解
- php魔法函数__autoload用法
- PHP关于__autoload的用法
- 朝鲜问题还没解决 特朗普大棒一挥又指向了伊朗,真是精力旺盛啊
- greendao3出现 Error:Execution failed for task ':app:greendao'.
- React 还是 Vue: 你应该选择哪一个Web前端框架?NG就暂时NG了吧
- 微信静默授权登录
- Java基础知识学习笔记总结
- php __autoload
- 解决Tomcat创建虚拟目录遇到的所有问题。
- NRF24L01 接收程序放中断函数函数里不生效的解决办法
- Spring 学习 1--Spring各种参数绑定注解解析
- 如何用敏捷进行自我管理
- RxPermissions 使用(基于RxJava2)
- set_include_path和get_include_path用法详解
- overload和override的区别
- django 修改server端口号