PHP & AJAX & Promise

PHP的基本语法

  1. 基本结构<?php ?>

  2. 注释
    (1) 单行注释://
    (2) 多行注释:/**/

  3. 变量
    (1) 以 $ 符号开始,后面跟着变量的名称( ( 2 ) 称为标识符,不属于变量组成部分) (2) 以 符号开始,后面跟着变量的名称($称为标识符,不属于变量组成部分)
    (3) 区分大小写
    (4) 没有声明变量的命令,也没有声明提前的概念。

  4. 常量
    (1) 规范
      ① 命名规则与变量一致,但常量名不需要加 $ 修饰符
      ② 定义后不可被修改,默认是全局作用域,常量建议全部大写
    (2) 定义常量并赋值:define(“MY_NAME”, “laoxie”)

  5. 作用域:
    (1) 全局变量:在函数外部定义的变量,可以在任意位置访问(需要手动定义为全局变量)
    (2) 局部变量:函数内部声明的变量,仅能在函数内部访问
    备注:手动定义为全局变量

* global关键字       global $变量名

* $GLOBALS 		    超级全局变量,数组: $GLOBALS["变量名"]

* $_SERVER			是一个包含了头信息(header)、路径(path)等信息的数组

* $_POST、$_GET 	被广泛应用于收集表单数据,常用于ajax请求等操作

* $_COOKIE			用于收集前端发送过来的cookie数据

* $_REQUEST		    变量包含了的内容$_POST、$_GET和$_COOKIE的内容

* $_SESSION		    服务器版cookie

* $_FILES
  1. 输出语句
    (1) echo可以输出一个或多个字符串(字符串可以包含HTML标签),速度较快,一般用于向前 端返回数据
 json_encode(array,JSON_UNESCAPED_UNICODE);     //把数组转成字符串
 json_decode(json,assoc);                       //把字符串转成数组/对象
 json:待解码的 json string                      //格式的字符串
 assoc:                            //默认false,返回object, 当该参数为 true 时,将返回array

  (2) print_r:打印关于变量的信息,适用于数组、对象的打印,一般用于测试
  (3) var_dump():判断一个变量的类型与长度,并输出变量的数据类型和数值,

  1. 拼接字符串用 .

数据类型

  1. 字符串string
    (1) strlen() 获取字符串长度,得到的字符的字节数
    (2) mb_strlen() 获取字符串长度
    (3) strpos() 查找某个字符在字符串中的索引(字节数),如果未找到匹配,则返回 false

  2. Array
    (1) 创建数组array
      ① 数值数组array(1,“aa”,3)
      ② 关联数组(类似于js对象)

//例:
$arr = array(
	"name" => "lemon",
	"age" => 17
)

    ③多维数组:一般都是外层为数值数组,内层为关联数组(类似于js的数组对象)

  (2) 操作数组
    ①数值数组:数组[索引]
    ②关联数组:数组[‘键’]

  (3)常用方法
    ① count()获取数组的长度
    ② array_rand()随机获取数组的索引值
    ③ in_array() 判断某个值是否存在数组中
    ④ array_slice($arr,startIdx,qty) 从数组中取出一段
      $arr:     数组名
      startIdx   开始裁剪索引
      qty     裁剪数目

  (4) 遍历
    ① for() 一般用于遍历数值数组
    ② foreach() 一般用于遍历关联数组

foreach($arr as $item)   遍历数值数组,$item代表数组每一项
foreach($arr2 as $key => $val) 
//备注:遍历关联数组,$key代表数组每一项的键,$val代表数组每一项的值
  1. 数组排序
    (1) sort() 对数组进行升序排列

    (2) rsort() 对数组进行降序排列

    (3) asort() 根据关联数组的值,对数组进行升序排列

    (4) ksort() 根据关联数组的键,对数组进行升序排

    (5) arsort() 根据关联数组的值,对数组进行降序排列

    (6) krsort() 根据关联数组的键,对数组进行降序排列

PHP本地数据操作

  1. 获取前端数据
    (1) $_GET 获取前端用get方式传递过来的数据(url地址后面数据也能被获取)
    (2) $_POST 获取前端用get方式传递过来的数据
    (3) isset() 判断某个值是否被设置,若不存在返回boolean

  2. 文件的读取与写入
    (1) fopen(path,mode):打开文件
       a) 使用fopen函数打开文件时,你首先需要明确打开文件的模式:
        将数据写入文件,亦或者读写文件
        考虑如果文件中已经存在相关数据,你是覆盖原有文件中的数据呢,还是仅仅 将新数据添加至文件末尾

     b) 文件模式:
        r 以只读方式打开文件,从文件头开始读
        r+ 以读写方式打开文件,写入时以追加的方式写入文件
        w 以写入方式打开文件,从文件头开始写。文件不存在则尝试创建,若存在, 则先删除文件中的内容
        w+ 以读写方式打开文件,从文件头开始读写。文件不存在则尝试创建,若存在, 则先删除文件中的内容
        a 以写入方式打开,从文件末尾开始追加写。如果文件不存在则尝试创建
        a+ 以读写方式打开,从文件末尾开始追加写入或者读。如果文件不存在则尝试 创建

   (2) fread(file,length) 读取内容
   (3) filesize(path) 读取文件字符长度
   (4) fwrite(file,json) 写入内容
   (5) fclose(file) 关闭文件,避免资源占用

  1. eval的使用
    var json = ‘{“name”:“lemon”,“age”:18}’; //标准json字符串
    var json = ‘{“name”:“lemon”,‘age’:18}’;//不标准
    eval(’(’+json+’)’);//将字符串转成对象
    eval(‘1+2’);//3
    eval(‘定义函数;执行函数’) //函数可以在字符串中执行

  2. 获取其他网站的所有内容

   file_get_contents(“http://2018.ip138.com/ic.asp”)

  1. 解决乱码
$content = iconv(原字符编码,新字符编码,$content) //修改$content字符编码
  1. 正则匹配
preg_match($reg,$str,$res);
  • $reg 正则
  • $str 所有内容
  • $res 匹配最终的结果

Ajax (关键点在于XMLHttpRequest异步请求对象)

  1. 创建异步请求对象 var xhr = new XMLHttpRequest();

  2. 建立与服务器连接,设置请求参数 open(type,url,async)
    (1) type 请求类型:get post
    (2) url 请求路径(get请求的数据必须接在url后面)
       ①相对路径:必须在同一个根目录下
       ②绝对路径:同源策略 同域(同源策略):协议,域名,端口三者一致

备注:报错:No ‘Access-Control-Allow-Origin’ header is present on the requested resource. Origin ‘null’ is therefore not allowed access. 说明跨域了

   (3) async 是否异步,默认为true(异步)
     ③异步:与其他操作同时执行,也叫并发(图片加载,ajax请求,定时器)
     ④同步:按步骤顺序执行,前面的代码执行完后,后面的代码才会执行(排队)

  1. 发送请求 send(data):向服务器发送请求
    (1)data:可选参数,post请求时才生效,表示发请求时传送的数据字符串

    (2)setRequestHeader(key,val):设置请求头
      设置请求头必须在open方法调用后设置
      利用请求头设置POST提交数据格式
      xhr.setRequestHeader(‘content-type’,“application/x-www-form-urlencoded”)

  2. 等待响应数据解析完毕,处理服务器返回数据

  • 判断准备阶段 xhr.readyState == 4
  • 判断http响应状态 xhr.status200 || xhr.status304
  • 接收响应数据 responseText

备注:
(1) readyState
  0 :(未初始化)尚未调用open()方法。
  1 :(启动)已经调用open()方法,但尚未调用send()方法。
  2 :(发送)send()方法执行完成,但尚未接收到响应。
  3 :(接收)已经接收到部分响应数据。
  4 :(完成)响应内容解析完成,可以在客户端调用了

只要readyState 属性的值由一个值变成另一个值,都会触发一次readystatechange 事件。 必须在调用open()之前指定onreadystatechange事件处理程序才能确保跨浏览器兼容性。

(2)status

  • 响应的HTTP 状态。
    200(OK):服务器成功返回了页面
    304(Not Modified):数据与服务器相同,不需要重服务器请求(直接使用缓存的数据)
    400(Bad Request):语法错误导致服务器不识别
    401(Unauthorized):请求需要用户认证
    404(Not found):请求地址不存在
    500(Internal Server Error):服务器出错或无响应
    503(ServiceUnavailable):由于服务器过载或维护导致无法完

(3)responseText 保存服务器返回的数据(从服务器返回的数据是“字符串”)

Ajax跨域解决方案

  1. JSONP
    (1) JSONP 是JSON with padding(填充式JSON 或参数式JSON)的简写

    (2) JSONP是一种可以绕过浏览器的安全限制,从不同的域请求数据的方法。使用JSONP需要服 务器端提供必要的支持

    (3) jsonp请求原理
      ① JSONP的原理是通过script标签发起一个GET请求来取代XHR请求
        a) JSONP生成一个script标签并插到DOM中
        b) 然后浏览器会接管并向src属性所指向的地址发送请求
        c) 从服务器端返回一段js代码,这段代码就是一个函数的执行(执行时把数据作为参 数传入,函数为本地预定义的函数),这个我们就间接地得到了服务器传出的数据
      ②步骤
        a) 预定义全局函数getData
        b) 生成script标签,请求服务器地址,并附带函数名
        c) 服务器返回js文件(js文件里面包含我们预先定义的函数执行)
    请求成功后,得到的js代码为
        d) getData({ name: ‘王大锤’,age: 30,sex: ‘男’,married:false })

  (4) jsonp缺点
     1) 这种方法只支持GET方式,不如POST方式安全

  1. CORS
    (1) CORS是一个W3C标准,全称是”跨域资源共享”(Cross-origin resource sharing),它允许浏览器向跨源服务器发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制

   (2) CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10

   (3) Access-Control-Allow-Origin

该字段是必须的。需要在后端响应头添加词字段,值要么是一个*,表示接受任意域名的 请求,要么指定一个域名http://localhost,如想指定若干个请使用判断语句,php代码如下:

$allow_origin = array(  
     'http://www.client.com',  
     'http://www.client2.com'  
 );  
 if(in_array($origin, $allow_origin)){  
     header('Access-Control-Allow-Origin:'.$origin);  
 }

   (4) Access-Control-Allow-Methods
       header(‘Access-Control-Allow-Methods:POST’);

   (5) Access-Control-Allow-Headers
      header(‘Access-Control-Allow-Headers:x-requested-with,content-type’);

  1. 服务器代理
    (1) 后端不存在跨域问题,所以可以利用后端间接获取其他网站的数据
    (2) Promise
       ① Promise是一个构造函数,所谓的Promise对象,就是通过new Promise()实例化得到 的对象,用来传递异步操作的消息。它代表了某个未来才会知道结果的事件(通常是一 个异步操作),并且这个事件提供统一的 API,可供进一步处理。
       ② promise的三种状态
          Pending(未完成)可以理解为Promise对象实例创建时候的初始状态
          Resolved(成功) 可以理解为成功的状态
          Rejected(失败) 可以理解为失败的状态

      ③ promise方法
        a) 静态方法
          (1) Promise 传递异步操作的数据

var p = new Promise(function(resolve,reject){
let x = Math.random();
if (x < 0.5) {
resolve(111);   //执行参数resolve()相当于执行p.then()里面的函数
} else {
reject(222);   //执行参数reject(),相当于执行p.catch()里面的函数
}
})
p.then(function(data){
console.log(data);
}).catch(function(res){
    console.log(res)
});

          (2) promise.all([p1,p2,p3…])
            将多个Promise实例,包装成一个新的Promise实例
            所有参数中的promise状态都为resolved是,新的promise状态才为resolved
            只要p1、p2、p3…之中有一个被rejected,新的promise的状态就变成rejected

          (3) Promise.race([p1,p2,p3…]) // 竞速,完成一个即可

         b)原型方法
         (1) Promise.prototype.then(successFn[,failFn])
             Promise实例生成以后,可以用then方法分别指定Resolved状态和Rejected 状态的回调函数。并根据Promise对象的状态来确定执行的操作:
             resolved时执行第一个函数successFn
             rejected时执行第二个函数failFn

         (2) Promise.prototype.catch(failFn)

  1. try…catch
//尝试执行代码,如果有错误则执行catch捕获错误(不报错)
try{
	console.log(666)
	//先尝试执行这里的代码
	show();
	//无报错,则忽略catch
	//如果报错,则执行catch,并传递错误信息
}catch(error){
	console.log(error)
}
console.log('end');
xhr的兼容写法
var req = null;
try{
    req = new XMLHttpRequest();
}catch(err){
    // ie低版本浏览有多种异步请求的实现
    try{
        req = new ActiveXObject("Msxml2.XMLHTTP");
    }catch(err){
        try{
            req = new ActiveXObject("Microsoft.XMLHTTP");
        }catch(err){
            alert('你的浏览器太low了,这个世界不适合你');
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_42827425/article/details/88575637