意思就是简单方便,自动加载让代码不用手动引入一个类就可以使用它。它的基础是使用命名空间前置条件tpVERSION='5.1.39LTS'(5.1就可以)熟悉PHP内置函数spl_autoload_register()get_declared_classes()代码实现入口文件。第一步加载基础文件base.php和加载Loader.php类,注册自动加载Loader::register();register()的主要作用是注册自动加载,然后设置属性(self::$prefixDirsPsr4...)把命名空间(app,think...)和对应的文件路径//注册自动加载机制publicstaticfunctionregister($autoload=''){//注册系统自动加载传入的参数为空使用本类下的autoload方法spl_autoload_register($autoload?:'think\\Loader::autoload',true,true);//获取应用的根目录$rootPath=\//下面注释中的值默认为该方法第一次生成的值,即在base.php::register();动作$rootPath=self::getRootPath();//self::$composerPath=\vendor\composer\self::$composerPath=$rootPath。'小贩'。DIRECTORY_SEPARATOR。“作曲家”。DIRECTORY_SEPARATOR;//Composer自动加载支持if(is_dir(self::$composerPath)){if(is_file(self::$composerPath.'autoload_static.php')){requireself::$compose路径。'autoload_static.php';//返回定义类名的数组$declaredClass=get_declared_classes();//$composerClass=Composer\Autoload\ComposerStaticInitb22aa0543af0539791954cd9546b8e78//也就是前面介绍的autoload_static.php文件中的Class,每个人的可能不一样$composerClass=array_pop($declaredClass);//var_dump($composerClass);die;foreach(['prefixLengthsPsr4','prefixDirsPsr4','fallbackDirsPsr4','prefixesPsr0','fallbackDirsPsr0','classMap','files']as$attr){if(property_exists($composerClass,$attr)){self::${$attr}=$composerClass::${$attr};}}//这个类现在有几个属性'prefixLengthsPsr4'...内容和autoload_static.php中一致}else{self::registerComposerLoader(self::$composerPath);}}//注册命名空间定义//这里是在self::添加两项到$prefixDirsPsr4数组//self::$prefixDirsPsr4=[//'think\composer\'=>[__DIR__.'/..'。'/topthink/think-installer/src']//'app\'=>[__DIR__.'/../..'。'/application',]//'think\'=>['$rootPath.thinkphp\library\think']//'traits\'=>[$rootPath.'thinkphp\library\traits']//]//这个数组将命名空间指向对应的文件路径self::addNamespace(['think'=>__DIR__,'traits'=>dirname(__DIR__).DIRECTORY_SEPARATOR.'traits',]);//加载类库映射文件);}//自动加载extend目录和之前的self::addNamespace()方法类似self::addAutoLoadDir($rootPath.'extend');}autoload方法主要是找到$class对应的文件,最后导入文件//自动加载publicstaticfunctionautoload($class){//$class='思考\错误';在base.php中执行Error::register();找不到think\Error,传递类名if(isset(self::$classAlias[$class])){returnclass_alias(self::$classAlias[$class],$class);}//找到$class对应的文件赋值给file,最后导入fileif($file=self::findFile($class)){//Win环境严格区分大小写if(strpos(PHP_OS,'WIN')!==false&&pathinfo($file,PATHINFO_FILENAME)!=pathinfo(realpath($file),PATHINFO_FILENAME)){returnfalse;}__include_file($文件);返回真;}}再看findFile方法,/***查找文件*@accessprivate*@paramstring$class*@returnstring|false*/privatestaticfunctionfindFile($class){if(!empty(self::$classMap[$class])){//类库映射returnself::$classMap[$class];}//找到PSR-4//$logicalPathPsr4="think\Error.php"$logicalPathPsr4=strtr($class,'\\',DIRECTORY_SEPARATOR)。'.php';//下面对应几个不同的场景,使用register()方法中设置的几个属性,从不同的属性拼接路径,$first=$class[0];//first=tif(isset(self::$prefixLengthsPsr4[$first])){foreach(self::$prefixLengthsPsr4[$first]as$prefix=>$length){if(0===strpos($class,$prefix)){foreach(self::$prefixDirsPsr4[$prefix]as$dir){if(is_file($file=$dir.DIRECTORY_SEPARATOR.substr($logicalPathPsr4,$length))){return$file;}}}}}//后者省略//查找PSR-4后备目录//查找PSR-0//查找PSR-0后备目录returnself::$classMap[$class]=false;}实战1.在项目中根目录下添加tong目录,如何实现tong目录下的自动加载方法:在register()方法中,添加代码nearself::addAutoLoadDir($rootPath.'extend');:self::addAutoLoadDir($rootPath.'tong');2.在tong目录下添加di目录,tong/如何实现di目录下自动加载的方法:di目录下的类可以通过设置namespace为di来扩展。熟悉psr4规范总结注册registers实现自动加载,然后设置属性autoLoad调用findFile,最后导入文件findFile根据register设置的属性找到对应的$class在文件中查看这些代码的时候,必须经常使用断点查看变量值~~~~
