[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C8Yxa422-1633351695439)(C:UsersASUSAppDataRoamingTyporatypora-user-imagesimage-20210916185255649.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o4F8Hj9Y-1633351695442)(C:UsersASUSAppDataRoamingTyporatypora-user-imagesimage-20210916184628449.png)]
二.前言1.PHP也是用于开发web应用程序的技术,优点是入门相对较快,框架封装相对高效,有一定的市场,有很多第三方的库
2.是B/S应用程序,所以脱离不了请求响应模型
3.PHP和JAVA不同
(1)Java会有一个运行Java技术的应用服务器,一般称之为容器,例如tomcat就是一个jsp或servlet的容器
(2)php运行时大多数依赖web server (用业界很成熟的Apache、Nginx),不同于Java会单独去开发一个类似tomcat。也就是说静态的东西:HTML网页,图像,样式表,脚本,都会由前端的web server作响应,但是只有对Apache、Nginx做一些相应的配置,比方说接收到PHP文件index.php,提到该请求就不由Apache、Nginx作响应了,它会丢到一个类似于插件(PHP可以理解为PHP的虚拟机),把index.php这种动态程序交给PHP处理,之后返回给Apache、Nginx 配插件的事交给phpstudy
三.步骤1.启动
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JK38d2Fv-1633351695443)(C:UsersASUSAppDataRoamingTyporatypora-user-imagesimage-20210916194404895.png)]
2.给项目进行配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ePJvUQrk-1633351695446)(C:UsersASUSAppDataRoamingTyporatypora-user-imagesimage-20210916234343684.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iMFIX8sZ-1633351695447)(C:UsersASUSAppDataRoamingTyporatypora-user-imagesimage-20210917100454195.png)]
上面的index.html如果把后缀改为php,就变为动态文件了,就可以写php相关内容了,如下图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c8Lwu7Dt-1633351695447)(C:UsersASUSAppDataRoamingTyporatypora-user-imagesimage-20210917100616547.png)]
注
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3OhuDLcn-1633351695448)(C:UsersASUSAppDataRoamingTyporatypora-user-imagesimage-20210916194815744.png)]
这个host文件对于当前操作系统来说可以不需要去查询外部的dns服务器.
意思是例如在地址栏里输入一个网址,原本输入网址后浏览器需要去查找外部的dns服务器(域名服务器),官方的运营商会有域名服务器,这些域名服务器又和国际上的十几个根服务器接上,也就是某个域名服务器上会找到此域名所对应的IP地址,找到IP地址就相当于定位了主机,然后就可以将请求发出去,这是浏览器的行为.
这个host文件也是配置域名和IP地址的
小知识
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b9W5E7Ew-1633351695448)(C:UsersASUSAppDataRoamingTyporatypora-user-imagesimage-20210917102402593.png)]
这是输入数据库的命令
mysql -u root -p
第二节 基础知识 一.变量- 变量以 $ 符号开始,后面跟着变量的名称
- 变量名必须以字母或者下划线字符开始
- 变量名只能包含字母、数字以及下划线(A-z、0-9 和 _ )
- 变量名不能包含空格
- 变量名是区分大小写的($y 和 $Y 是两个不同的变量)
注:1.php最早就是用来写网络动态程序的,到如今已经是面向对象的特性与JAVA非常相似:继承,多态,接口等等
但php是弱类型的语言(脚本语言偏向于弱类型),JVAVA是强类型
2.运行php时可以通过网页形式去访问,也可以运行如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oFp9zswF-1633351695449)(C:UsersASUSAppDataRoamingTyporatypora-user-imagesimage-20210917133405514.png)]
因为该文件夹不是new出来的,而是从项目中打开,所以没有选择php的执行程序,相当于新建项目没有指定JDK一样
解决如下
注意一下这里有问题没解决,settings里没有PHP
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R8DJoRlr-1633351695450)(file:///C:UsersASUSdocumentsTencent Files2193434426ImageC2CImage1DXFS]WA7$CFP][B{@I{_}CA.png)]
二.数据类型String(字符串), Integer(整型), Float(浮点型), Boolean(布尔型), Array(数组), Object(对象), NULL(空值)
注
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ig6HofGb-1633351695450)(C:UsersASUSAppDataRoamingTyporatypora-user-imagesimage-20210917131925958.png)]
上述响应的是静态文件
三.类型比较- 松散比较:使用两个等号 == 比较,只比较值,不比较类型。
- 严格比较:用三个等号 === 比较,除了比较值,也比较类型。
字符串的拼接用 . (一个点号)
PHP_EOL; // 换行符
第三节 ThinkPHP开发手册解读网址https://www.kancloud.cn/manual/thinkphp6_0/1037510
一.基础 二.架构 1.请求流程对于一个HTTP应用来说,从用户发起请求到响应输出结束,大致的标准请求流程如下:
- 载入Composer的自动加载autoload文件
- 实例化系统应用基础类thinkApp
- 获取应用目录等相关路径信息
- 加载全局的服务提供provider.php文件
- 设置容器实例及应用对象实例,确保当前容器对象唯一
- 从容器中获取HTTP应用类thinkHttp
- 执行HTTP应用类的run方法启动一个HTTP应用
- 获取当前请求对象实例(默认为 appRequest 继承thinkRequest)保存到容器
- 执行thinkApp类的初始化方法initialize
- 加载环境变量文件.env和全局初始化文件
- 加载全局公共文件、系统助手函数、全局配置文件、全局事件定义和全局服务定义
- 判断应用模式(调试或者部署模式)
- 监听AppInit事件
- 注册异常处理
- 服务注册
- 启动注册的服务
- 加载全局中间件定义
- 监听HttpRun事件
- 执行全局中间件
- 执行路由调度(Route类dispatch方法)
- 如果开启路由则检查路由缓存
- 加载路由定义
- 监听RouteLoaded事件
- 如果开启注解路由则检测注解路由
- 路由检测(中间流程很复杂 略)
- 路由调度对象thinkrouteDispatch初始化
- 设置当前请求的控制器和操作名
- 注册路由中间件
- 绑定数据模型
- 设置路由额外参数
- 执行数据自动验证
- 执行路由调度子类的exec方法返回响应thinkResponse对象
- 获取当前请求的控制器对象实例
- 利用反射机制注册控制器中间件
- 执行控制器方法以及前后置中间件
- 执行当前响应对象的send方法输出
- 执行HTTP应用对象的end方法善后
- 监听HttpEnd事件
- 执行中间件的end回调
- 写入当前请求的日志信息
至此,当前请求流程结束。
总结来说
我们要写的代码就在controller层,控制器里会调用一堆的公共函数,或业务、模型之类。控制器的return如果是HTML代码,则直接返回输出;此外,也可以返回模板,使用调用模板,把数据传给模板,然后模板生成HTML代码。如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x5BMvcyy-1633351695451)(C:UsersASUSAppDataRoamingTyporatypora-user-imagesimage-20210922212422517.png)]
如果是多应用的话则可以有多个入口文件:在public目录下可以写多个入口文件,将其转到不同的应用下即可
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4CkvGTQy-1633351695451)(C:UsersASUSAppDataRoamingTyporatypora-user-imagesimage-20210922215846260.png)]
2.入口文件https://www.kancloud.cn/manual/thinkphp6_0/1037487
三.路由 四.控制器 1.控制器定义控制器文件通常放在controller下面,类名和文件名保持大小写一致,并采用驼峰命名(首字母大写)
如果要改变controller目录名,需要在route.php配置文件中设置:
'controller_layer' => 'controllers',
默认就会有一个index.php如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8B8beTeI-1633351695452)(C:UsersASUSAppDataRoamingTyporatypora-user-imagesimage-20210920081048609.png)]
默认这个index的控制器里有index的动作,如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cOCGcRnL-1633351695453)(C:UsersASUSAppDataRoamingTyporatypora-user-imagesimage-20210920081157409.png)]
(1)单应用模式如果使用的是单应用模式,那么控制器的类的定义如下:
(2)多应用模式多应用模式下,控制器类定义仅仅是命名空间有所区别,例如:
控制器类文件的实际位置是
appshopcontrollerUser.php访问URL地址是(假设没有定义路由的情况下)
http://localhost/index.php/shop/user/login(3)渲染输出默认情况下,控制器的输出全部采用return的方式,无需进行任何的手动输出,系统会自动完成渲染内容的输出。
控制器一般不需要任何输出,直接return即可。并且控制器在json请求会自动转换为json格式输出。
不要在控制器中使用包括die、exit在内的中断代码。如果你需要调试并中止执行,可以使用系统提供的halt助手函数。
halt('输出测试');注:JSON的全称是”Javascript Object Notation”,意思是Javascript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式。XML也是一种数据交换格式,为什么没有选择XML呢?因为XML虽然可以作为跨平台的数据交换格式,但是在JS(Javascript的简写)中处理XML非常不方便,同时XML标记比数据多,增加了交换产生的流量,而JSON没有附加的任何标记,在JS中可作为对象处理,所以我们更倾向于选择JSON来交换数据。这篇文章主要从以下几个方面来说明JSON。
(4)多级控制器由于URL访问不能访问默认的多级控制器(可能会把多级控制器名误识别为URL后缀),因此建议所有的多级控制器都通过路由定义后访问,如果要在路由定义中使用多级控制器,可以使用:
Route::get('user/blog','user.blog/index');2.基础控制器大多数情况下,我们建议给你的控制器继承一个基础控制器。
默认安装后,系统提供了一个appbaseController基础控制器类,你可以对该基础控制器进行修改。
注:继承可以实现依赖注入
之后自己定义的控制器都继承这个默认安装好的baseController
该基础控制器仅仅提供了控制器验证功能,并注入了thinkApp和thinkRequest对象,因此你可以直接在控制器中使用app和request属性调用thinkApp和thinkRequest对象实例,下面是一个例子:
namespace appcontroller; use appbaseController; class Index extends baseController { public function index() { $action = $this->request->action(); $path = $this->app->getbasePath(); } }(1)控制器验证基础控制器提供了数据验证功能,使用如下:
namespace appcontroller; use appbaseController; use thinkexceptionValidateException; class Index extends baseController { public function index() { try { $this->validate( [ 'name' => 'thinkphp', 'email' => 'thinkphp@qq.com', ], 'appindexvalidateUser'); } catch (ValidateException $e) { // 验证失败 输出错误信息 dump($e->getError()); } } }3.空控制器空控制器的概念是指当系统找不到指定的控制器名称的时候,系统会尝试定位当前应用下的空控制器(Error)类,利用这个机制我们可以用来定制错误页面和进行URL的优化。
解决的问题就是防止用户输入时输入了没有定义的控制器,即会跳转到该页面
4.资源控制器 5.控制器中间件类似于spring中的切面编程的通知
中间件会在处理请求时预先做出一些设置
支持为控制器定义中间件,你只需要在你的控制器中定义middleware属性,例如:
五.视图注意
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hOvojc52-1633351695453)(C:UsersASUSAppDataRoamingTyporatypora-user-imagesimage-20210920092004193.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RgelIXuV-1633351695454)(C:UsersASUSAppDataRoamingTyporatypora-user-imagesimage-20210920092051976.png)]
1.模板变量 (1)助手函数如果使用view助手函数渲染输出的话,可以使用下面的方法进行模板变量赋值:
return view('index', [ 'name' => 'ThinkPHP', 'email' => 'thinkphp@qq.com' ]);助手函数的变量赋值也是当次模板渲染有效。
模板引擎使用模板去输出页面
新版框架默认只能支持PHP原生模板,如果需要使用thinkTemplate模板引擎,需要安装think-view扩展(该扩展会自动安装think-template依赖库)。
composer require topthink/think-view下载后如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WMay1Qtj-1633351695454)(C:UsersASUSAppDataRoamingTyporatypora-user-imagesimage-20210920091718914.png)]
-1633351695453)]
[外链图片转存中…(img-RgelIXuV-1633351695454)]
1.模板变量 (1)助手函数如果使用view助手函数渲染输出的话,可以使用下面的方法进行模板变量赋值:
return view('index', [ 'name' => 'ThinkPHP', 'email' => 'thinkphp@qq.com' ]);助手函数的变量赋值也是当次模板渲染有效。
模板引擎使用模板去输出页面
新版框架默认只能支持PHP原生模板,如果需要使用thinkTemplate模板引擎,需要安装think-view扩展(该扩展会自动安装think-template依赖库)。
composer require topthink/think-view下载后如下
[外链图片转存中…(img-WMay1Qtj-1633351695454)]



