| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> PHP知识库 -> 后端php总结 -> 正文阅读 |
|
[PHP知识库]后端php总结 |
php中所有的变量都要以$开头,js中只要var,let,const一下就可以直接使用。之后使用就不用带这个定义的。但是php中,只要是变量就要一直都有。 可变函数和匿名函数的调用。前面都有$。因为这两种的函数名其实都是变量,在变量后加(),但是用function定义的函数和js一样,直接调用不用加$ php中都是函数的形式,但是js中一些皆对象。所以函数其实是方法,需要要用对象.方法的形式来调用。 js中用的都是对象.属性。或者是对象.函数的形式。因为js一些皆对象,调用也也用对象和属性的形式来调用。 字符串的链接,是用来两个都是变量,或者一个是变量,一个是字符串的链接,如果两个都是字符串,就没必要用点了。写在一起就可以了。 什么时候要对引号和\使用转义,引号,在单引号内部,只能转义单引号和\,双引号内部,可以转义很多。转义是为了避免,内容中的引号,或者内容中的\(如果这个\和引号链接了,比如命名空间中的\)和开头的引号引起了冲突,所以要转义。如果不转义,那字符串的长度就提前结束了。 php的是函数,所以一般都有返回值。js中的是方法,所以一般都没有返回值,方法,是用来给属性赋值的。所以可以不用返回值。 命名空间,定义的时候只要到文件夹,使用的时候要到具体的类。 tp和laravel都是单入口的模式,单入口,只要在入口文件中引入一次,那以后所有的请求,都会有这个引入的问题,因为 每次请求都是要从这个入口进入的,然后再dispatch。ecshop不是单入口模式的。所以要在每个请求的页面都引入需要的文件。 命名规范 目录用小写和下划线 类的文件名,用大驼峰,其他的文集用小写和下划线 函数名,用小写加下划线 方法和属性用小驼峰 常量用大写和下划线 总之,类和类的文件名,用大驼峰。属性和方法用小驼峰。常量全大写和下划线。其余目录名和函数用小写和下划线。 echo是关键字,所以在使用的时候不用加(),print_r和var_dump是函数,所以在使用的时候要写(); $arr[] = $v;每次复制,就相当于网数组$arr中再新增一个元素。 isset()判断是否设置了,请求不是null empty()判断是否为空。
php中,实参可以大于形参,但是实参不能小于形参,除非形参有默认值。 php中,双引号的变量可以被识别解析,及时这个变量被单引号包裹。只要还被双引号包裹,就可以被解析。 js中ajax来请求服务器api。php中用curl或者fie_get_content来访问别的网址。 url不区分大小写,所以路由中的地址,一般都是小写加上下划线 对与cookie或者session来存储数组。数组的小标相当于数据库中的id。所以要起的有意义。这样可以方便取的时候更加好取。 对于循环内的数据组,数组的下标可以为[] => $arr[],或者数组的下标为循环索引。那这样得到的新数组都是新增元素。 数据类型的自我理解: 不同的数据类型有它们自己的特性。数据类型知识保存数据的一种方式(这是保存在内存中的,不是持久化存储)。比如hash,比如set。本质上都是用某种规则来更好的保存数据,最终能方便以后的使用。 不同的数据类型也有不同的api,可以方便对数据的处理和筛选=>可以方便更好的取到想要的数据,比如放到数组中,放到set也能实现。但是利用set的特性,放到set中,能更为方便的取到想要的数据。 redis也有发布和订阅。可以用来做消息队列。 递归的自我理解:递归也是循环,和循环有点类似,常规的循环,通过循环次数来限定和跳出循环。但是递归关心的不是循环次数,递归关心的是最后一次调用本函数。通过这个条件来跳出递归,和循环类似,但是跳出的条件和思路不同。 递归的跳出:可以用return来跳出,当得到某一条件的时候return。也可以用if来跳出,当不满足这个条件的时候就不在执行递归的那个函数。 关于session的简单理解,可以把session理解成一个特殊的超全局数组。但是访问这个数组中,必须要有sessionid,有了它,就可以像访问$_post一样访问,而且Session是持久化的,因为保存在了硬盘上。 一次访问的所有变量都会被保存在数组中。但是这些变量有自己的作用域。超全局变量,可以在这个访问中都可以被调用。全局变量,只能在当前的页面中被调用。局部变量只能在局部函数中被调用。 常量一旦被声明将可以在全局可见,也就是说,它们可以函数内外使用,但是这仅仅限于一个页面之中(包含我们通过include和include_once)包含进来的PHP脚本,但是在其他的页面中就不能使用了。==>最好别在包含文件中使用这些常量,因为你不知道这些页面是否会被其他文件调用。如果其他文件中没有定义这个常量,那就会报错。 但是为何,一次性请求中。能取到所以变量,这些变量分布在不同的页面中,难道他们都是超全局?看下源码。。或者是因为通过require引入的原因吗?或者是和命名空间有关?(只对,常量,类,函数有效。)命名空间只是把类放在不同的虚拟文件夹中,方便require的近来,对作用域并不会有任何影响。 require过来的文件,会影响作用域吗?==》超全局和局部肯定不影响。那全局变量的作用域是否会影响? 类内部的属性作用域:都已经用protected,public,privated限定好了。变量才有作用域,把实例好的对象,赋值给变量以后,就有这个对象的作用域了。 如果是在全局环境中引入一个文件,那这个文件是可以直接访问全局变量的。如果在局部作用域(函数内)引入文件, 那这个引入的作用域也是局部的。 那如果在一次请求中,所有用到的文件都是通过require串联在一起的。所以原则上在入口处定义的变量,那在全局范围都是可以用的(局部作用域内不行)。但是如果要在所有作用域(包含局部作用域)中都要可以使用的话,就要用到超全局变量,或者常量。 所以在类的内部。也是一个封闭的作用域。要想外部能访问到。只能用public,或者可以用超全部变量,$request. 总之------- 超全局,在一次请求中。全局和局部都可以访问 常量,和超全局一样,但是定义后就不能修改 全局,只能在全局作用域。 一次请求中。所有需要的文件,都是通过require串联起来,所以全局变量也都可以使用。但是面向过程的写法 ,在全局的范围内,很容易导致变量的覆盖。但是再面向对象的写法中。所有的变量其实都是在类的内部,都有自己的局部作用域,变量就不会被覆盖。 设置响应头,header()告诉浏览器怎么做; 跨域做验证码验证。要借助cache这个跳板。因为首先,用api的话,是不能穿cookie的。所以sessionid是没办法通过cookie获取到的。那就不能再session中获取到保存的验证码。可以系统生成一个唯一id,然后发送给客户端。并且把唯一id和sessionid用键值对的形式保存在cache中。 这样当发起验证的时候,通过唯一id,在cache中获取到sessionid,然后就可以得到session,并且得到保存在session中的真是验证,从而可以完成验证。 因为在api中。是没有办法用到cookie的,所以,要用唯一id的形式来代替cookie。并且把真是数据保存在服务器端的cache中,这样就可以解决本地cookie的问题。 jwt的原理:jwt不用session和cookie,用的是token 用加密的方式得到token,保存一份在数据库中。然后发送给客户端。 客户端在header头部authorizaton中带上这个token发送给服务器,服务器进行验证。 保存在数据中的原因是,因为判断token是否失效,或者是否过期。因为token不像session,会到期自动删除。 vue的事件监听器,看成一个事件。=》vue本身就是数据绑定,和事件监听 1,写在vue内部的事件,监听数据变化的时候触发 2,用来监听数据变化的事件。=》 和change有些相似 3,事件函数写在method中,然后再监听器中调用 vue生命周期的理解 1,整个项目只有一个vue实例 2,每个月页面都是有若干个组件组成,每个组件都是一个vuecomponent实例 3,所以每个组件都有自己的生命周期。在初始化结束后,并在没有被销毁之前,就一直处于事件监听的状态之中。 axios可以当函数,也可以当对象,当函数直接用axios({xxx})的形式。当对象用axios.post()这种形式。 对于是一对多,还是属于的关系。要先看正向,就是先看是一对多,还是一对一。这和属于是同事存在的,有一对多,就有属于。有一对一,就有属于,这两种关系一定是同时存在的。所以只要分析出正向关系,那属于关系就自然出来了。 一对多和属于这种关系,都写在自己的模型中。a一对多b,就写a这个模型中;b属于a,就写在b这个模型中。至于调用。就通过类实例出来的模型调用就可以了,要先找到模型对象。laralve得到的orm就是模型对象。如果有数据的模型对象里有Attribute这个属性。可以直接获取到数据。如果没有数据的orm就是没有Attribute这个属性的对象,不能获取数据。但是都可以调用model中的方法。 laravel中的模型对象分为3中 1,没有Attribute的模型对象,一般是直接 new model()得到的 2,有Attribute的模型对象。一般是通过操作数据库后得到的模型对象。find,first,create,update(返回影响行数),delete 3,是有多个2这种模型对象,组合成的collection对象。是一个集合 = get with的作用,是解决n+1的问题,即使没有with,在blade模板中得到了的是模型对象,也可以调用一对多的方法得到需要的数据。 有with以后,如果把模型对象转换成数组,那这个数组会带上关联模型上的数据,所以加上with比较好。 $limit = max (min($limit,100),10);? 10到100的区间 laravel中的跨域。跨域是在哪一层被拦截的?是在Apache层,还是在php层? 在服务器端,在php层。 跨域?服务器的的域名。和前端api访问的域名不一样?但是这样能访问吗?就是在www.aa.com这个网站下,调用www.bbb.com这个api。这样就跨域了。 跨域是浏览器的同源策略导致。是浏览器的锅,其他端不用考虑跨域。 CORS允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。 CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。 因此,实现CORS通信的关键是服务器。 基本只需要对服务器动手脚,前端代码跟同源时一样,也就是不跨域时一样。所以只要服务器端允许,就可以了。就能解决跨域问题。 所有laravel的跨域,是在中间件解决的。设置响应头。
laravel中的验证$this->validate()的验证错误信息。 1,用的blade模板,错误信息可以直接在页面中显示。用{{ $errors->any }}就可以获取到。错误是保存在闪存中 2.但是用的是接口模式。由于没有地方可以输出错误信息。所以错误信息会抛出异常,那就要通过try catch的形式来捕获异常,然后再用json返回给前端页面。 3,只要有正常返回,对于前端来说都是success的状态,至于返回的状态码是什么不重要。都是进入success。只有某些特数据情况才会进入前端的error。比如返回的属于类型,和前端要求的不一致。ajax请求进入error的情况 - 简书 laravel中,用的redirect后,就是第二次请求了。那第一次请求中的所有变量就没办法再次使用。如果要想在第二次请求中,用到第一次请求中的变量,那就只能做持久化了。比如可以放到session中了。 laravel中抛出异常的情况 1,在用$this->validate()的验证用。用的是api模式,会抛出异常 2,在mysql的事物中,回滚就会抛出异常。所以要用try catch 3,在findOrFeail fistorfail这类方法中,会抛出异常。 命名空间是区分大小写的,如果名命名空间用了小写是找不到具体的类的,这是个坑 laravel中 ,搜索的原理,就是在get()前面的$query加上when条件。when的第一个参数是一个boolen值,第二个是异步闭包。 php中闭包的作用,是否和js中类似?闭包是一个回调函数。是对原函数内部的一个补充。开发代码让开发者自己可以根据业务需求来填写。闭包也可以形成一个自己的独立的局部作用域。 laravel中的链式调用。在find方法之前,返回的都是Builder对象。调用后会直接改变这个builder对象。所以在分开的链式调用中。不用返回存储,也会把最新得到的builder对象,覆盖掉原来的builder对象,应该通用的是地址引用。直接改变了原来的builder里值。 php中的解构,用的是list,但是list只能解构索引数组。相当于js中的数组解构。js中的对象解构,是用属性名来解构属性值。 laravel中,$request得到的是get或者post的值,这个值get是用queryString的形式 在路由中要不要传参,要看定义路由的时候有没有要求传参。 对于资源路由,需要传参的,方法有。show,destory,update,edit,可以通过隐式绑定来传参。1,要在创建控制器的时候设置模型。 php artisan make:controller Admin/RoleController -m Models/Role 2,在blade中,ruote第二个参数,可以直接传递模型对象。或者也可以传递id,这样在控制器中是都可以获取到模型对象的。就不用再用find查一遍数据。 由于php是区分大小写的,所以在设置路由的地方,要注意大小写,在给路由命名的时候,和在blade中使用路由名称的时候都要注意大小写,不然会找不到路由。 laravel中访问逻辑是:在blade中先访问路由别名,通过路由别名,找到具体的路由。具体的路由就网址。然后通过网址找到对应的控制器,执行控制器中的代码。 laravel项目书写流程 1,创建模型 php artisan make:model Models/FangOwner -m 2,完成迁移文件的书写并执行 3,php artisan make:seeder FangSeeder php artisan make:factory FangFactory -m FangOwener 4,创建路由 5,创建控制器? =》并指定模型 6,创建blade文件 laravel的访问器和修改器 $this->attribute['xxx'] = 修改后的值。? 修改器 访问器。方法参数中的value是原来的值 在访问器中把最终得到的值用return返回出去就可以了 php扩展和composer有什么区别? 对于redis,有扩展,也有composer包 功能其实是一样的,扩展使用c写的。在底层和应用进行交互,效率可能会更高效有点 包是用php进行写的。一般手机用socket进行和应用交互的。性能也可以,laravel官方推荐使用phpredis的包 比如redis和es在laravel中都是用composer进行交互的,而不是用的扩展。这两种形式都可以和别的应用进行交互 ,只是实现的原理不一样的,一个用的c,一个用的php语言,一个用的底层通信,一个用的是socket通信。 在混编中,blade中,js函数。js函数的调用,传递的是字符串。如果直接把字符串写在函数调用内,是要写引号的。即使这个参数是用php模板中得到的,也要在实参外部加一个单引号。加了以后才是字符串。 同理在html中? <input type = "text" value = "{{ }}"? ?=》? 这个也是加在引号里面的,所以写在js中的实参中,也需要加引号,加了以后才是字符串。 laravel中es的使用。 1,安装es的程序。是基于java的,所以要先安装java环境 2,安装es的composer包=》不用扩展,用来和es进行交互。操控es。 composer require elasticsearch/elasticsearch 3,用包的api创建一个es的索引(就是数据库)=》可以在laravel中创建一个控制器,来实现这个功能 4,在要用的地方调用es的api,得到数据,加入es索引中 blade某班中,修改页面的,如果遇到多选,或者是下拉的情况 1,先要获取所有的选项数据,用foreach把数据循环出来 2,获取选中的数据 3,在每项数据上加一个判断,1中循环出来的数据,和2中的数据相等,然后加一个selected属性。 对于后台生成的数据给前端使用分两种情况。 1,生成纯数据 具体用哪种,需要看需求,因为有些判断写在php中较为方便,那就可以把html写在php中,把生成好的html给前端。 laravel中的,接口登录虽然用的jwt,但是首次登录用的还是session验证。用来判断是否登录成功,用的是auth()->attempt()的方式。来判断登录是否成功。 登录成功后再创建jwt,保存一份到mysql中,发送一份给客户端。 再客户访问其他页面的时候,要判断这个jwt,从而防止翻墙。 laravel中让数据库的某个字段的值加1 用$click = $model->click +1; $model ->update(['click'=>$click])这种方式在高并发的时候回出问题,因为这个其实是分成了两部,第一步是查询,第二部是修改。如果要用这种方式解决,要用事务+锁的形式来解决。 或者也可以用一条sql就可以解决。 updata xxx set click = click + 1;这个sql语句具有原子性,可以让后面的sql语句排队。 或者用laravel中的 $userModel ->increment('click'); 这种方式也是可以解决; 相对于只有一条sql语句。 laravel中的异步,=》计划任务,和消息队列 |
|
PHP知识库 最新文章 |
Laravel 下实现 Google 2fa 验证 |
UUCTF WP |
DASCTF10月 web |
XAMPP任意命令执行提升权限漏洞(CVE-2020- |
[GYCTF2020]Easyphp |
iwebsec靶场 代码执行关卡通关笔记 |
多个线程同步执行,多个线程依次执行,多个 |
php 没事记录下常用方法 (TP5.1) |
php之jwt |
2021-09-18 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/28 13:51:19- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |