PHP的基本语法
-
基本结构<?php ?>
-
注释
(1) 单行注释://
(2) 多行注释:/**/ -
变量
(1) 以 $ 符号开始,后面跟着变量的名称( 称 为 标 识 符 , 不 属 于 变 量 组 成 部 分 ) ( 2 ) 以 称为标识符,不属于变量组成部分) (2) 以 称为标识符,不属于变量组成部分)(2)以符号开始,后面跟着变量的名称($称为标识符,不属于变量组成部分)
(3) 区分大小写
(4) 没有声明变量的命令,也没有声明提前的概念。 -
常量
(1) 规范
① 命名规则与变量一致,但常量名不需要加 $ 修饰符
② 定义后不可被修改,默认是全局作用域,常量建议全部大写
(2) 定义常量并赋值:define(“MY_NAME”, “laoxie”) -
作用域:
(1) 全局变量:在函数外部定义的变量,可以在任意位置访问(需要手动定义为全局变量)
(2) 局部变量:函数内部声明的变量,仅能在函数内部访问
备注:手动定义为全局变量
* global关键字 global $变量名
* $GLOBALS 超级全局变量,数组: $GLOBALS["变量名"]
* $_SERVER 是一个包含了头信息(header)、路径(path)等信息的数组
* $_POST、$_GET 被广泛应用于收集表单数据,常用于ajax请求等操作
* $_COOKIE 用于收集前端发送过来的cookie数据
* $_REQUEST 变量包含了的内容$_POST、$_GET和$_COOKIE的内容
* $_SESSION 服务器版cookie
* $_FILES
- 输出语句
(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():判断一个变量的类型与长度,并输出变量的数据类型和数值,
- 拼接字符串用 .
数据类型
-
字符串string
(1) strlen() 获取字符串长度,得到的字符的字节数
(2) mb_strlen() 获取字符串长度
(3) strpos() 查找某个字符在字符串中的索引(字节数),如果未找到匹配,则返回 false -
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) sort() 对数组进行升序排列
(2) rsort() 对数组进行降序排列
(3) asort() 根据关联数组的值,对数组进行升序排列
(4) ksort() 根据关联数组的键,对数组进行升序排
(5) arsort() 根据关联数组的值,对数组进行降序排列
(6) krsort() 根据关联数组的键,对数组进行降序排列
PHP本地数据操作
-
获取前端数据
(1) $_GET 获取前端用get方式传递过来的数据(url地址后面数据也能被获取)
(2) $_POST 获取前端用get方式传递过来的数据
(3) isset() 判断某个值是否被设置,若不存在返回boolean -
文件的读取与写入
(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) 关闭文件,避免资源占用
-
eval的使用
var json = ‘{“name”:“lemon”,“age”:18}’; //标准json字符串
var json = ‘{“name”:“lemon”,‘age’:18}’;//不标准
eval(’(’+json+’)’);//将字符串转成对象
eval(‘1+2’);//3
eval(‘定义函数;执行函数’) //函数可以在字符串中执行 -
获取其他网站的所有内容
file_get_contents(“http://2018.ip138.com/ic.asp”)
- 解决乱码
$content = iconv(原字符编码,新字符编码,$content) //修改$content字符编码
- 正则匹配
preg_match($reg,$str,$res);
- $reg 正则
- $str 所有内容
- $res 匹配最终的结果
Ajax (关键点在于XMLHttpRequest异步请求对象)
-
创建异步请求对象 var xhr = new XMLHttpRequest();
-
建立与服务器连接,设置请求参数 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请求,定时器)
④同步:按步骤顺序执行,前面的代码执行完后,后面的代码才会执行(排队)
-
发送请求 send(data):向服务器发送请求
(1)data:可选参数,post请求时才生效,表示发请求时传送的数据字符串
(2)setRequestHeader(key,val):设置请求头
设置请求头必须在open方法调用后设置
利用请求头设置POST提交数据格式
xhr.setRequestHeader(‘content-type’,“application/x-www-form-urlencoded”) -
等待响应数据解析完毕,处理服务器返回数据
- 判断准备阶段 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跨域解决方案
- 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方式安全
- 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) 后端不存在跨域问题,所以可以利用后端间接获取其他网站的数据
(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)
- 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了,这个世界不适合你');
}
}
}