PHP/Composer是如何加载一个类的
PHP/composer开发中,我们只需要require 'vendor/autoload.php'
,然后就可以直接使用各种类了。那么这些类是如何加载的呢?其中有没有什么可以优化的点呢?
概览
PHP/composer下,类的加载主要到如下部分(还没有包括各个部分的初始化逻辑):
1 | PHP中zend_lookup_class_ex |
PHP的类加载
首先,PHP在运行的时候,需要一个类,是通过zend_lookup_class_ex
来找到这个类的相关信息的。
zend_lookup_class_ex
查找类的主要逻辑如下(假设类名字放到变量lc_name中):
1 | ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, const zval *key, int use_autoload) /* {{{ */ |
- lc_name转化成小写(这说明PHP中类名字不区分大小写)
- 然后在EG(class_table)找,如果找到,直接返回(我们自己注册的类,扩展注册的类都是这样找到的)
- 然后查看EG(autoload_func),如果没有则将__autoload注册上(值得注意的是,如果注册了EG(autoload_func),则不会走__autoload)
- 通过EG(in_autoload)判断是否递归加载了(EG(in_autoload)是一个栈,记载了那些类正在被autoload加载)
- 然后调用EG(autoload_func),并返回类信息