当前位置: 首页 > 后端技术 > PHP

PHP手写MVC(二)——自动加载与Bootstrap

时间:2023-03-29 20:33:46 PHP

类自动加载:在使用类的时候,会使用require或者include来加载类,但是每次手动加载都会导致一系列的问题,比如class重复加载,管理困难等。所以为了解决上述问题,我们使用单个文件来完成所有类的自动加载。spl_autoload_register()这个函数可以注册任意数量的自动加载器,在使用未定义的类(class)和接口(interface)时自动加载。通过注册自动加载器,脚本引擎有最后一次机会在PHP因错误而失败之前加载所需的类。尽管__autoload()函数也可以自动加载类和接口,但首选spl_autoload_register()函数。spl_autoload_register()提供了一种更灵活的方式来实现类的自动加载(在同一个应用程序中,可以支持任意数量的加载器,例如第三方库中的加载器)。因此,__autoload()函数已弃用,并且可能会在未来的版本中弃用。在core目录下创建Autoload.php文件$cdtinyphp/core$touchAutoload.phpeditAutoload.php//命名空间和文件目录映射'core','app'=>'app','controller'=>'app/controllers','model'=>'app/models','view'=>'app/views','dispatcher'=>'core/dispatcher',];/***参数$class表示自动加载的类名**在匿名函数中使用use可以使用外部变量*/spl_autoload_register(function($class)use($path){//解析类名,如果used如果输入了命名空间,就会在$path中搜索对应的路径【强烈建议把这个地方打印出来,自动加载会很清楚】$position=strripos($class,'\\');$key=substr($class,0,$position);$value=$path[$key]??'';$file=substr($class,$position+1).'.php';需要APP_PATH。'/'.$value.'/'.$file;});spl_autoload_register()主要实现类的自动加载。该参数使用匿名函数。外部变量$path可以通过关键字use来使用。它的作用是提供命名空间和路径的对应关系。比如使用namespacecontroller,对应的类在app/controllers路径下。使用方法是直接require入口文件public/index.php中的文件。boot=new\app\Bootstrap();}publicfunctionrun(){/***执行启动项*init开头的所有方法都会被调用**/foreach(get_class_methods($this->boot)as$func){if(0===strpos($func,'init')){call_user_func([$this->boot,$func]);}}}。..启动框架在入口文件index.php中启动框架,执行run()方法run();进入public目录,两种方式执行php命令行$phpindex.phpBootstrap:1Bootstrap:2使用PHP内置服务器$php-Slocalhost:8080在浏览器中输入http://localhost:8080,结果如下Bootstrap:1Bootstrap:2从结果可以看出,Application类在实例化时执行了构造函数,启动项的方法调用是在构造函数中完成的。3.小结本节实现了一个简单的类自动加载和框架的核心类,启动时加载用户启动项,app/Bootstrap.php中以init开头的所有方法都会依次调用。下次见