php
Hypertext Preprocessor //超文本预处理器
吸收了C语言,java和perl的特点,利于学习,使用广泛,主要适用于web开发领域
1.1特性
- php独特的语法混合了c,java,perl以及php自创新的语法
- php可以比CGI或者prel更快速的执行动态页面——动态页面方面,与其他的编程语言相比,php是将程序嵌入到HTML文档中去执行,执行效率比完全生成html标记的OGI要高许多;php具有非常强大的功能所有CGI的功能都能实现
- php支持几乎所有流行的数据库以及操作系统
- 最重要的是php可以用c,c++进行程序的扩展
1.2基础语法
1.2.1标记
<?php ?>
//标记
也允许使用<? ?>
,但不鼓励使用,更改配置文件为short_open_tag=on
php标记与html标记可以混合使用,php解释器会将php标记中的代码执行结果作为html的内容
1.2.2注释
//
//行注释
#
//函数注释
/* */
//块级注释
输入输出
前端获取,表单提交 //输入
echo “” //字符串输出
print() //字符串输出
print_r([]) //数组输出
var_dump() //调试输出
1.3数据类型&类型转换
1.3.1数据类型
标准类型
boolean(布尔型)
string(字符串)
integer(整形)
float(浮点型) //double
复合类型
array //数组
object //对象
特殊类型
null //空
resource //资源
1.3.2类型转换
强制转换
(类型名)被转换的数据
转换函数
intval(),floatval(),strval(),boolval()
1.4变量&常量
1.4.1变量
1.1定义
在php中,虽然数据有类型之分,但是保存数据的变量却不需要类型,php会自动判断变量中保存的是什么类型的数据
以$开头
一个有效的变量名由字母或者下划线开头,后面跟上任意数量的字母,数字,或者下划线
1.2销毁变量
unset()
1.3变量判断
empty() //判断变量是否为false或不存在
isset() //判断变量是否存在且不为null
1.4预定义变量
$_GLOBALS:局部变量作用全局
$_SERVER:服务器和执行环境的信息
$_REQUEST:包含get,post,cookie的所有信息
$_POST:通过post提交
$_GET:通过get获取
$_FILES:通过post上传到服务器的文件数据
$_ENV:通过环境方式传递给当前脚本的变量组成的数组
$_COOKIE:通过http cookie 方式传递给当前脚本的变量组成的数组
$_SEESSION:当前脚本可用session变量组成的数组
1.5全局变量
函数外定义的变量
1.6局部变量
函数内定义的变量
静态变量static //不会因为函数的调用而销毁
可变函数 //如果一个变量名后有圆括号,php将寻找与变量的值同名的函数
ps:
- 若全局变量和局部变量重名,默认使用局部变量
- 局部内使用global声明全局
1.7超全局变量
$globals数组,所有的全局变量都是此数组的一个键
$_SERVER | 这是一个包含了诸如头信息(header),路径(path),以及脚本位置(script locations)等等信息的数组。这个数组中的项目由web服务器创建 |
---|---|
$_GET | 通过url参数传递给当前脚本的变量的数组 |
$_POST | 当http post请求的content-type是application/x-www-form-urlencoded |
$_FILES | 通过http post方式上传到当前脚本的项目的数组 |
$_COOKIE | 通过http cookies方式传递给当前脚本的变量的数组 |
$_SESSION | 当前脚本可用SESSION变量的数组 |
$_REQUEST | 默认情况下包含了 G E T , GET, GET,POST,$_COOKIE的数组 |
$_ENV | 通过环境方式传递给当前脚本的变量的数组 |
1.4.2常量
- 整形常量
- 浮点型常量
- 字符串常量 //在php中,单引号和双引号都表示字符串常量
1.1定义
php中没有宏这样的c语言概念,但是它定义常量的方式容易引起误会,因为它使用的是define函数
ps:
- 在定义常量时,常量的名字需要用字符串来传递,而它的初始值可以是任意类型
- 一旦被定义就不能被重新定义或取消定义
- 常量名没有$
define()函数来定义常量,const类定义之外定义常量
1.2预定义常量
php_version /php版本号
php_eol //
魔术常量
1.5变量作用域
1)local
2)global
3)static
4)parameter
1.6运算符&表达式
1.6.1算数运算符
运算符 | 描述 |
---|---|
x + x+ x+y | 加 |
x − x- x−y | 减 |
x ∗ x* x∗y | 乘 |
x / x/ x/y | 除 |
x x% xy | 模 //除法的余数 |
-$x | 取反 |
a . a. a.b | 并置 |
1.6.2赋值运算符
运算符 | 描述 |
---|---|
x = x= x=y | 左操作数被设置为右侧表达式的值 |
x + = x+= x+=y | 加 |
x − = x-= x−=y | 减 |
x ∗ = x*= x∗=y | 乘 |
x / = x/= x/=y | 除 |
x x%= xy | 模 //除法的余数 |
a . = a.= a.=b | 连接两个字符串 |
1.6.3递增递减运算符
运算符 | 描述 |
---|---|
++$x | 预递增 |
$x++ | 后递增 |
–$x | 预递减 |
$x– | 后递减 |
1.6.4比较运算符
运算符 | 描述 |
---|---|
x = = x== x==y | 等于 |
x = = = x=== x===y | 绝对等于 //判断类型 |
x ! = x!= x!=y | 不等于 |
x < > x<> x<>y | 不等于 |
x ! = = x!== x!==y | 绝对不等于 //判断类型 |
x > x> x>y | 大于 |
x < x< x<y | 小于 |
x > = x>= x>=y | 大于等于 |
x < = x<= x<=y | 小于等于 |
1.6.5逻辑运算符
运算符 | 描述 |
---|---|
$x and $y | 与 |
$x or $y | 或 |
$x xor $y | 异或 |
$x && $y | 与 |
$x || $y | 或 |
!$x | 非 |
1.6.6三元运算符
(expr1)?(expr2):(expr3)
1.6.7其他运算符
运算符 | 名称 | 描述 |
---|---|---|
@ | 错误控制运算符 | 语句出错时不会终止脚本运行 |
`` | 执行运算符 | 将内容作为命令行来执行 |
instanceof | 类型运算符 | 检测变量是否是属于某种类型 |
1.7数组
- 由键值对组成,在初始化时,使用=>符号来初始化键值对
- 在初始化时,如果只指定了值而没有给定键,php默认使用数值作为键,且这些键会自动递增
- 数组可以嵌套
- 给数组中不存在的键赋值时,会先创建该键,然后再赋值
- 获取数组中不存在的键的值,会报错
1.7.1创建数组
使用函数 //arry&range
使用中括号[] //自变量
1.7.2分类
1.1索引数组
定义数组时如果没有指定键,那么这个数组可被称为索引数组
索引数组实际是字典,只不过在初始化时并没有指定它们的键,php默认使用自动增长的数字作为值得列表
下标纯数字,默认0
1.2关联数组
关联数组实际就是字典,在初始化时,需要使用=>来分别指定键值,运算符得左边是键,右边是值
下标不是数字
ps:
数组中的下标是不重复的,如果重复了,后面的值会覆盖前面的值,保留一个
1.3多维数组
多维数组的本质就是使用数值作为键,使用另一个数组作为值
1.4数组的输出
下标或键·
1.5数组操作函数
函数名 | 描述 |
---|---|
array() | 创建数组 |
array_keys() | 返回数组中所有的键名 |
array_key_exists() | 检查指定的键名是否存在于数组中 |
array_pop() | 删除数组的最后一个元素 //出栈 |
array_push() | 将一个或多个元素插入数组末尾 //入栈 |
array_rand() | 返回数组中一个或多个随机的键 |
array_reverse() | 以相反的顺序返回数组 |
array_slice() | 数组切片 |
array_splice() | 删除并替换数组中指定的元素 |
count() | 返回数组中元素的数目 |
shuffle() | 将数组打乱 |
1.8语句
1.8.1条件语句
if
if else
switch
1.8.2循环语句
while
do while
for
foreach
1.8.2结束循环
break #跳出当前循环
continue #舍弃后置代码继续循环
goto #跳转位置
1.9函数
php中使用function作为定义函数的关键字,php中的函数并不需要说明返回值类型,如果函数存在参数,参数也不需要说明类型
php中的函数支持默认参数,但是不支持函数重载,也就意味着在php中不能同时存在两个同名函数
function //函数定义
1.9.1函数调用
在php中调用函数和在c语言中调用函数是一样的:通过函数名调用即可
函数返回:return
1.9.2函数传参
函数的形参中定义了几个形参,在调用函数时就需要提供几个形参,但是有些时候是有例外的,例如,在定义函数时,如果设置了默认形参,那么在调用该函数时就不需要传递已经设置了默认形参的参数
在函数内部修改了形参,实参的值也不会受到影响(除非传递的是数组类型),但是在定义函数的时候,如果将形参的类型修饰为引用类型,在函数内部修改形参就能修改实参
- 值传递 //拷贝值
- 引用传递 //拷贝地址
1.9.3默认传参
从右往左依次设置
1.9.4引用类型传参
在默认情况下,修改形参是不能作用到实参上的,因为形参和实参是两个独立的内存单元( 不包含数组)
实现方法 //在形参名前加上符号:&即可
1.9.5可变长参数
可变长参数实现之后的结果类似于printf这样的函数,它可以接收无限个参数
实现方法 //定义一个参数,并在参数名前加上…
实现原理 //在函数调用时,php会将这个函数的实参列表打包成一个数组,然后传给函数,函数在内部访问这个数组就能得到所有参数了
不定传参
命名传参 //关键字传参
1.9.6闭包
php中,需要在闭包函数中使用use关键字,并在圆括号中填写那些将会在闭包内部使用的变量
匿名函数
2.1字符串
单引号 //‘’,不解析变量,不解析转义字符
双引号 //“”,如果出现了变量名没那么会解析出来作为字符串的一部分
定界符 //<<<,也可解析,可写多行
2.1.1字符串操作
html操作
函数名 | 描述 | 语法 |
---|---|---|
addcslashes() | 返回在指定的字符前添加反斜杠的字符串 | |
addslashes() | 返会在预定义的字符前添加反斜杠的字符串 | |
html_entity_decode() | 把html实体转换为字符 | |
htmlentities() | 把字符转换为html实体 | |
htmlspecialchars_decode() | 把一些预定义的html实体转换为字符 | |
htmlspecialchars() | 把一些预定义的字符转换为html实体 | |
nl2br() | 在字符串的每个新行之前插入html换行符 | |
strip_tags() | 剥去字符串中的html和php标签 | |
stripcslashes() | 删除由addcslashes()函数添加的反斜杠 | |
stripslashes() | 删除由addslashes()函数添加的反斜杠 |
常规字符串操作
函数名 | 描述 | 语法 |
---|---|---|
chunk_split() | 将字符串分割为一连串更小的部分 //该函数不改变原始字符串 | chunk_split(string,length,end) |
str_split() | 将字符串分割到数组中 | str_split(string,length) |
strtok() | 将字符串分割为更小的字符串 //标记 | strtok(string,split) |
explode() | 将字符打散为数组 | explode(separator,string,limit) |
str_shuffle() | 随机打乱字符串中的所有字符 | str_shuffle(string) |
implode() | 返回由数组元素组合成的字符串 | implode(separator,array) |
join() | 返回由数组元素组合成的字符串 //implode()别名 | join(separator,array) |
bin2hex() | 将ascii字符的字符串转换为十六进制值 | bin2hex(string) |
hex2bin() | 将十六进制值得字符串转换为ascii字符 | hex2bin(string) |
lcfirst() | 将字符串中的首字符转换为小写 | lcfirst(string) |
ltrim() | 移除字符串左侧的空白字符或其他预定义字符 | ltrim(string,charlist) |
rtrim() | 移除字符串右侧的空白字符或其他预定义字符 | rtrim(string,charlist) |
trim() | 移除字符串两侧的空白字符或其他预定义字符 | trim(string,charlist) |
number_format() | 通过千位分组来格式化数字 //该函数支持一个两个或四个参数 | number_format(number,decimals,decimalpoint,separator) |
similar_text() | 计算两个字符串的相似度 | similar_text(string1,string2,percent) |
str_ireplace() | 替换字符串中的字符 //不区分大小写 | str_ireplace(find,replace,string,count) |
str_replace() | 替换字符串中的字符 //区分大小写 | str_replace(find,replace,string,count) |
str_repeat() | 将字符串重复指定次数 | str_repeat(string,repeat) |
str_word_count() | 计算字符串中的单词数 | str_word_count(string,return,char) |
strcasecmp() | 比较两个字符串 //不区分大小写 | strcasecmp(string1,string2) |
strcmp() | 比较两个字符串 //区分大小写 | strcasecmp(string1,string2) |
strchr() | 搜索字符串在另一字符串中的第一次出现 | strchr(string,search,before_search) |
strpos() | 查找字符串在另一字符串中第一次出现的位置 //区分大小写 | strpos(string,find,start) |
strlen() | 返回字符串的长度 | strlen(string) |
stristr() | 搜索字符串在另一字符串中的第一次出现 //不区分大小写 | stristr(string,search,before_search) |
stripos() | 查找字符串在另一字符串中第一次出现的位置 //不区分大小写 | stripos(string,find,start) |
strrchr() | 查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符 | strrchr(string,char) |
strrev() | 反转字符串 | strrev(string) |
strtoupper() | 将所有字符转为大写 | strtoupper(string) |
strtolower() | 将所有字符转为小写 | strtoupper(string) |
substr() | 返回字符串的一部分 | substr(string,start,length) |
字符串输出函数
函数 | 描述 |
---|---|
echo() | 输出一个或多个字符串 |
print() | 输出一个或多个字符串 |
printf() | 输出格式化字符串 |
fprintf() | 把格式化的字符串写入到指定的输出流 |
sprintf() | 把格式化的字符串写入变量中 |
sscanf() | 根据指定的格式解析来自字符串的输入 |
parse_str() | 把查询字符串解析到变量中 |
ascii和字符互转
函数 | 描述 |
---|---|
chr() | 从指定的ascii值返回字符 |
ord() | 返回字符串中第一个字符的ascii值 |
hash计算
函数 | 描述 |
---|---|
crc32() | 计算字符串的32位CRC |
md5() | 计算字符串的MD5散列 |
md5_file() | 计算文件的MD5散列 |
shal() | 计算字符串的SHA-1散列 |
shal_file() | 计算文件的SHA-1散列 |
2.2表单
html表单
$_GET
&$_POST
文件上传表单
保存上传的文件
copy()
2.2.1http协议
工作方式
- 由客户端(浏览器)主动向服务端发出数据(请求)
- 由服务端被动向客户端回复数据(响应)
特点
- 无连接 //限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可节省传输时间
- 无状态 //协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快
url
统一资源定位符 //标识某处资源的地址
请求
请求行(request line),请求头部(header),请求数据,空行
请求方法
方法 | 描述 |
---|---|
GET | 请求指定的页面信息,并返回实体主体 |
HEAD | 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头 |
POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改 |
PUT | 从客户端向服务器传送的数据取代指定的文档的内容 |
DELETE | 请求服务器删除指定的页面 |
CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器 |
OPTIONS | 允许客户端查看服务器性能 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断 |
响应
状态行(status line),响应头部(header),空行,响应数据
状态行提供一个状态码
响应行 //由键值对组成,用于描述响应数据,或用于对客户端下达指令
应答头 | 说明 |
---|---|
Allow | 服务器支持的请求方法 |
Content-Encoding | 文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型 |
Set-Cookie | 表示内容长度 |
Content-Length | 表示后面的文档属于什么MIME类型。通常需要显式地指定为text/html |
Content-Type | 应该在什么时候认为文档已经过期,从而不在缓存它 |
Expires | 从服务端生成并传送给客户端的cookie,客户端(浏览器)会保存这些cookie |
状态码
200 //请求成功
301 //资源转移
404 //请求页面不存在
500 //表示内部服务器错误
2.2.1ajax
2.3面向对象
类定义 //class
伪变量 //$this
2.3.1类成员属性
类的成员变量叫做属性
成员属性声明是由关键字public,protected或private开头,然后跟一个普通的变量或常量声明来组成。属性中的变量可以初始化,但初始化的值必须是常数
1.1使用
在类中:
$this -->实例属性名
self::常量或静态属性名
在类外:
$对象名 -->实例属性名
$对象名::常量或静态属性名
ps:
关键字var也可以声明一个成员属性,它与public是一样的。通过$this和类名也能访问常量属性
2.3.2类成员方法
类的成员函数叫做方法,成员方法和属性一样,将一个函数放在类中定义,这个函数就是该类的成员方法
函数名前可以加上关键字public,protected或者private
和使用成员属性一样,调用成员方法的方式也有两种,一种是在类内,一种是在类外
在类内调用成员方法时,需要通过$this->,在类外调用成员方法时,通过对象来调用
2.3.3静态成员
- static //定义静态成员
- 静态成员也可以加上三大访问权限
- 在静态成员方法中,不能直接访问成员属性,也不能直接调用成员方法,但是可以访问静态成员变量
static function //静态方法
2.3.4封装&继承
封装
php通过类的访问控制符实现了封装性,访问控制符主要用于控制成员在类外的可见性
访问控制符:
- public //公有属性,类内外都能访问
- protected //保护属性,在类外无法访问,类内和子类可访问
- private //私有属性,类外和类内都无法访问
- 如果定义的成员属性没有指定访问控制符,那么默认为public
继承
extends //继承
继承后,子类发生变化:
- 子类会得到父类中的所有成员属性和成员方法
- 当子类编写构造函数,那么默认不调用父类的构造函数,需要手动调用,调用的时候,通过parent::__construct()的方式来调用
- 当子类的成员属性和父类的成员属性同名时,会覆盖父类的属性
- 当子类的成员方法和父类的成员方法同名时,在成员函数内部可以通过parent::方法名()来调用父类的同名方法
魔术方法
遍历对象
类的继承
2.3.5抽象类
定义为抽象的类不能被实例化
任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中的一样(或者更为宽松)。例如某个抽象的方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。此外方法的调用必须匹配,即类型和所需参数数量必须一致
作为基类,被继承
继承一个抽象类的时候,子类必须定义父类中的所有抽象方法
final //修改方法,子类中不能出现同名方法
2.3.6文件包含
在php中,一个文件使用一个类之前,如果这个文件中没有定义该类,就会报错,在php中可以使用require和require_once关键字来将另一文件引入到本文件中,两者的区别在于,前者不会检查是否重复包含,,而前者会
2.3.7命名空间
类似于目录
在一个php源码文件中不能同时定义两个同名函数,两个同名类,两个同名变量等等,而加入命名空间之后,相当于将两个同名函数/类/变量放入不同的目录下,避免了命名冲突,
1.1定义方法
namespace如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间,也就是说命名空间必须是程序脚本的第一条语句
1.2子命名空间
与目录与文件相似,php命名空间也允许指定层次化的命名空间的名称,因此,命名空间的名字可以使用的分层次的方式定义
1.3使用命名空间
直接使用
2.4cookie
一般用于凭据
$_COOKIE变量
setcookie函数
2.5session
会话
验证码机制
session_start() //函数,必须位于html标签前
$_SESSION
session_destroy()
2.6文件上传
$_FILES
name //文件名
tmp_name //路径
path //临时存储路径
2.7php扩展
在php根目录中,文件夹ext中 //php.ini配置