IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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()判断是否为空。

  • ""?(空字符串)
  • 0?(作为整数的0)
  • 0.0?(作为浮点数的0)
  • "0"?(作为字符串的0)
  • null
  • false
  • array()?(一个空数组)
  • $var;?(一个声明了,但是没有值的变量)

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的跨域,是在中间件解决的。设置响应头。

  public function handle($request, Closure $next)
    {
        $response = $next($request);
        $response->header('Access-Control-Allow-Origin', '*');
        $response->header('Access-Control-Allow-Headers', 'Origin, Content-Type, Cookie, Accept, multipart/form-data, application/json');
        $response->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, OPTIONS');
        $response->header('Access-Control-Allow-Credentials', 'false');
        return $response;
    }

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的形式
对于restful的参数。/xxx/要通过方法的参数来获取。

在路由中要不要传参,要看定义路由的时候有没有要求传参。

对于资源路由,需要传参的,方法有。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,生成纯数据
2,生成和数据拼接好的html

具体用哪种,需要看需求,因为有些判断写在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
上一篇文章      下一篇文章      查看所有文章
加:2021-11-16 18:37:48  更:2021-11-16 18:38:29 
 
开发: 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-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计