和Python用module来区分代码块不同,PHP按照命名空间来区分,开始学PHP的时候一心认定了如果想用 use 关键字来导入(Python的习惯说法)一个类或者函数或者其他对象的话,必须先include该对象所在的文件,或者require该文件.相当于是把该文件代码加载到内存代码块中,从而能够搜索代码块并使用.
但是看了thinkPHP框架和guthub上一些项目后发现他们的代码挺潇洒的,居然不用include/require.这让我对自己的认识产生了质疑...
少废话了,自动加载使用的是PHP的
spl_autoload_register
函数,该函数的作用是用于注册一些搜索规则*
当代码需要引用某些变量,类等的时候,如果当前内存代码块中没有,那么就会从这些注册的规则中取挨个的套用匹配,直到找不到,然后报错.
函数使用方式:
spl_autoload_register(function, throw, prepend) // throw 全都找不到是否抛错 prepend 是否将规则加在队列最前面(如果你的规则十分个性独特,就可以放在最前面)
也可以用匿名函数的方式:
<?php namespace spa; spl_autoload_register(function ($class) { echo "wanted " . $class . " "; if ($class == "spaSpace") { $class = "Space.php"; } elseif ($class == "spaEle") { $class = __DIR__."/../learn_php/Ele.php"; } include_once $class; });
通过测试发现,每次需要执行本文件本命名空间不存在的代码块的时候,都会执行一遍如上注册的函数,然后echo出的信息,当然项目框架最好是按照严格的命名规范来,这样也容易写出匹配规则,然后把该函数在项目的必经之路上执行一遍,就可以和那些潇洒的代码一样,直接 use ,不用include/require 文件了.
*注意:
注册规则的代码一定要最先执行,或者至少要在你本应当执行include/require之前被执行.