PHP 基础
一初识 PHP
PHP 是与 html 混合使用的嵌入式语言
1PHP 标记
默认标记 短标记, 需在 php.ini 中将 short_open_tag 选项开启 短标记和其他标记不提倡使用
2 关键字不区分大小写, 用户自定义的类名和函数名不区分大小写, 变量名区分大小写
3 输出
boolean print(参数) 返回布尔值
void echo(参数) 无返回值 echo 的效率要高一点
二数据类型
1 比较两个浮点数的通常方法是先移动若干小数位, 然后转换为整型数据再进行比较
2 双引号做分隔符的字符串支持变量名解析, 单引号做分隔符的字符串不支持变量名解析
$name="张三";
"$name"=> 张三 || '$name'=>$name || "$name 先生"=> 空 || "{$name} 先生"=> 张三先生 || "${name} 先生"=> 张三先生
3 字符串定义的方式: 单引号, 双引号和 heredoc(<<4 对象类型必须显式的进行声明类用关键字 class 定义, 使用关键字 new 生成这个类的实例, 使用 -> 符号类访问类中的属性和方法
class car{public $cololr;function beep(){}}$mycar = new car; $mycar->color='red'; $mycar->beep();
5PHP 是一种弱语言类型, 变量的类型会根据赋予的值自行确定, 而且往往在变量声明的同时进行变量初值的赋值
6 数据类型强制转换时, 只须将需要的类型名写在变量前的括号内即可
三常量和变量
1 定义常量 define("常量名", 表达式或值) 常量名建议全大写, 但不是必需的
使用常量 直接使用定义的常量名, 无须在常量名前加 "$"
预定义常量:_FILE_当前 PHP 程序文件名 _LINE_当前 PHP 程序所在的行数 (在哪指哪)
2 变量不需要显式的声明, 在对变量赋初值时就对变量进行了声明如果变量没有被设置初值, 则其初值即为 NULL
3 变量的赋值: 传值赋值和引用赋值如 $a=&$b; 即 b 原来指向了一个存储位置, 引用赋值后, a 也指向了这个存储位置, 这时,
a 或 b 的销毁都不会对对方造成任何影响, 但是如果其中一个的值改变了, 则另一个也会作出相同的改变
4 访问预定义变量之使用超全局变量, 总共 9 个超全局变量
5 局部变量: 在函数内定义的变量 只能在函数内使用
全局变量: 在函数外定义的变量 默认只能在函数外使用
要想在函数内使用全局变量, 需要在函数内将变量用 global 声明, 或者使用超全局变量数组 & GLOBALS["变量名"]
在 PHP 中, 只有函数能提供局部作用域
超全局变量 $GLOBALS 包含了全部的变量
静态变量的特点: 只有在第一次被调用时进行初始化, 函数结束后不销毁, 并且下次使用时, 该变量还保留原来的值
静态变量只能在函数内定义和使用
可变变量: 将变量的名字也作为一个变量来使用 $a=b;$b=c;$$a=$b=c;
外部变量: 使用 GET 方式能传递的数据最大为 256 字节, 使用 POST 最大为 2MB
四流程控制 (仅写与 java 等其他语言的不同)
1 交互格式 (冒号语法) 不建议使用, 经典的比较直观
2foreach(): 该语法是专门为数组设计的
第一种格式 foreach(target_array as $value) statement
第二种格式 foreach(target_array as $key=>$value) statement
3break 数字: 要跳出的结构的层数
contiue 数字: 要跳出的结构的层数
4exit 语句可以结束当前整个脚本的执行, 通常用于错误检查
exit; exit("错误原因");
die() 是 exit 的别名 $conn=mysql_connect("localhost","root","") or die(" 无法连接到 MySQL 服务器 ");
五数组
1 关联数组与数字索引数组唯一的区别在于索引的类型
2 数字索引数组
初始化: 直接为数组元素赋值 array() 函数
如果数组不存在, 那么为数组元素赋值的同时即可创建该数组
如果数组元素是按顺序排列的数字, 则在对数组进行初始化时, 可以使用 range() 函数
range() 有 3 个参数, 第一个参数指定初始值, 第二个参数指定终止值, 第三个参数可选, 用于指定步长
3 关联数组
初始化: 直接为数组元素赋值 array() 函数
4 与数组相关的运算符
+ 联合 $a+$b 将 $ 附件到 $a 之后, 但是任何索引值冲突的元素将不会被添加
== 等于 $a==$b 如果 $a 和 $b 包含相同元素, 返回 true(索引值和元素必须都相同) 除了顺序, 其他必须完全一样
!= <> 不等于
=== 恒等 如果 $a 和 $b 包含相同顺序的相同元素, 返回 true(索引值和元素必须都相同) 必须完全一模一样
!== 不恒等
5 数组的排序
boolean sort() 按数字和字母顺序排列 排列后会赋予新的索引值, 原有索引值被删除
void asort() 按升序对数组进行排序 排列后保留原来的索引关系
integer ksort() 按索引值升序进行排列
usort(数组, 方法名) 按用户自定义方法进行排序
array_multisort() 一次对多个数组进行排序
natsort() 按自然顺序排序, 排序后保留原有的索引关系
natcasesort() 自然排序, 不区分大小写
6 数组的反向排序
rsort() 对数组元素按降序排列
arsort()
krsort()
7 对数组进行重新排序
boolean shuffle() 对数组进行随机排列
array array_reverse() 将数组中的元素逆置
array array_flip() 将数组中的索引与其元素值兑换
8 数组的遍历
current() 获取数组中当前指针所指的元素值
next() 将数组的指针向后移动一位, 返回移动后指针所指向的元素的元素值
prev() 将数组的指针向前移动一位, 返回移动后指针所指向的元素的元素值
reset() 指针设置回数组的起始位置
end() 将指针移动到数组的最后一个元素处
each() 返回数组中当前指针所指向的索引 / 元素值对, 并将数组指针向后移动一位
返回一个包含 4 个元素的数组, 且该数组的索引分别为 0,key,1,value
key() 返回数组当前指针所指向的索引值
array_walk() 以相同的方式对数组中的每一个元素进行处理
array_reduce() 将自定义函数依次应用于数组的每个元素
9 其他的数组操作函数
list() 从一个数组中一次提取多个值, 并同时赋值给多个变量
count()/sizeof() 计算数组中元素的个数
六 PHP 中的字符串
1 访问字符串中的字符
字符串的三种定义方式: 单引号双引号和 Heredoc 方式
可以将字符串视为数组来处理 $test="hello"; $test{0}="h"; 推荐使用大括号, 以免与数组混淆
2 字符串的格式化
字符串的格式化处理通常包括: 去除字符串中多余的空格大小写转换加入和删除反斜杠和 HTML 格式化四部分
去除空格和其他符号
string trim(待处理的字符串, 过滤字符串)
如果不指定过滤字符串, 则默认去掉空格 Tab 字符换行符回车符字符串结束符和垂直制表符
可以使用.. 指定需要去除的一个范围, 例如 a..f 表示去掉 abcde 和 f
只对字符串首尾字符进行过滤, 即使指定了过滤字符串, 字符串中间部分也不会参与过滤
string lrtim(待处理的字符串, 过滤字符串)
去除字符串左边的空格和其他特殊字符
其他同 trim()
string rtrim(待处理的字符串, 过滤字符串), 别名函数 chop()
去除字符串右边的空格和其他特殊字符
其他同 trim()
对字符串大小写的转换
strtolower(待处理的字符串) 将指定字符串中的所有字符转换为小写
strtoupper(待处理的字符串) 将指定字符串中的所有字符转换为大写
ucfirst(待处理的字符串) 检查指定的字符串, 如果指定字符串的第一个字符是字母, 则将其转换为大写
ucword(待处理的字符串) 将指定字符串中的每个单词的首字母转换为大写
加入和删除反斜杠
在将任何字符串保存到数据库中之前, 应该使用 addslashes() 函数添加反斜杠;
在显示用户数据之前, 应该调用 stripslashes() 函数去除反斜杠
addslashes(待处理的字符串) 添加反斜杠
stripslashes(待处理的字符串) 删除反斜杠
HTML 格式化
nl2br(待处理的字符串) 可以将字符串中的换行符转换成 HTML 中的标签 "
", 从而在浏览器中实现换行
htmlspecialchars(待处理的字符串, 是否转换双引号和单引号, 字符集)
可以使一些特殊的字符被当成普通的文本输出, 而不会再进行 HTML 解析
第二个参数: 默认只对双引号进行转换, ENT_COMPAT 只转换双引号 ENT_QUOTES 都转换
ENT_NOQUOTES 不进行转换
第三个参数: 指定了转换时所使用的字符集, 默认为 ISO-8859-1
hemlentities(待处理的字符串, 是否转换双引号和单引号, 字符集)
功能同上, 但可以转义更多的特殊字符
heml_entity_decode(待处理的字符串, 是否转换双引号和单引号, 字符集)
可以对显示字符串进行反向转换, 转换后的字符串能够按 HTML 标签进行解析
strip_tags(待处理的字符串, 允许保留的 HTML 标签)
去除所有的 HTML 和 PHP 标记
3 字符串的连接和分割
explode(分隔符, 字符串, 被分割的字符串片断的数量) 按指定的分隔符将一个字符串分割
如果分隔符是字符串, 函数会根据字符串中的每个字符来进行分割, 而不会根据整个分割字符串来分割
implode(连接符, 需要连接成字符串的数组) 将一些字符串通过指定的连接符连接成一个字符串
join(连接符, 需要连接成字符串的数组) 功能同 implode()
substr(字符串, 开始位置, 提取长度) 从某个字符串中提取一部分子字符串
开始位置为负, 将得到一个从原字符串尾部开始, 长度为该负数绝对值的子字符串
提取长度为负, 子字符串取到倒数第 length 个字符前
这个不难理解,- 就表示从后面开始
strtok(字符串, 分隔符) 从指定字符串中取出一个字符串片段
如果分隔符是字符串, 函数会根据字符串中的第一个字符来进行分割, 而不会根据整个字符串来分割
在调用该函数对字符串进行连续分割时, 只有第一个分割时需要指定参数 str, 第一个分割后, 系统会自动
记录字符串及第一个分割后的指针位置, 继续调用该函数, 则会继续从该字符串指针的当前位置进行分割
如果希望重置指针到字符串起始位置, 只需将字符串重新作为参数传递给该函数即可
split(分隔符, 字符串, 返回字符串个数) 将一个字符串按指定的分隔符分解为多个子字符串
4 字符串的比较
可以使用 == 直接对字符串进行比较
strcmp(字符串 1, 字符串 2) 按字典顺序, 排在后面的大如果相等, 返回 0, 如果 str1 大于 str2, 返回正数, 否则负数
区分大小写
strcasecmp(字符串 1, 字符串 2) 同上, 不区分大小写
strnatcmp(字符串 1, 字符串 2) 按自然顺序进行字符串比较, 等于返回 0, 大于返回正数, 小于返回负数, 区分大小写
strnatcasecmp(字符串 1, 字符串 2) 按自然顺序进行比较, 不区分大小写
5 字符串的查找和替换
strstr(被查找的字符串, 要查找的关键字) 在一个字符串中查找匹配的字符串或字符, 如果查找到, 则返回从 str 字符中该 key 开始到字符串结尾的子字符串, 如果没有查到, 则返回 false, 如果不止一个, 则返回从第一个匹配到结 尾的子字符串
strisstr() 功能同上, 区别, 该函数不区分大小写
strchr(被查找的字符串, 要查找的关键字) 在一个字符串中查找要匹配的子字符串或字符, 该函数从字符串末端开始查找, 如果找到一个, 则返回从该 key 开始到字符串结尾的子字符串, 如果多于一个, 则返回从尾端开始的第一个匹配, 如果没有匹配, 则返回 false
strpos(要查找的字符串, 要查找的子字符串或字符, 从原始字符串的第 offset 个字符开始查找)
如果找到一个, 则返回位置, 从 0 开始, 如果不止一个, 返回第一个, 如果没有, 返回 flase
offset 不能为负, 否则无法开始查找
strrpos(要超找的字符串, 要查找的关键字, 从原始字符串的第 offset 个字符开始查找)
从字符串末端开始查找, 如果不止一个, 返回倒数第一个匹配
strripos(要查找的字符串, 要查找的关键字, 从原始字符串的第 offset 个字符开始查找)
功能同 strrpos(), 区别不区分大小写
stripos(要查找的字符串, 要查找的关键字, 从原始字符串的第 offset 个字符开始查找)
功能同 strpos() 区别不区分大小写
- str_replace(被替换的字符串或数组, 替换后的字符串或数组, 源字符串或数组, 被替换的次数)
- searchreplacesubject
把 subject 中的 search 替换为 replace
如果 search 是数组, replace 是字符串, 在 replace 会替换 search 数组中的所有元素
如果 search 和 replace 都是数组, 在 replace 中的元素会替换 search 中对应的元素
如果 search 数组中的元素个数多余 replace, 则多余的 search 数组中的元素会被空字符串替换
substr_replace(被操作的原始字符串, 用于替换的字符串, 要被替换的原始字符串的起始位置, 被替换的原始字符串 中字符的个数) 用于在指定位置中查找和替换字符串中特定的子字符串
起始位置: 如果为正, 从头开始计算, 如果为负, 从尾开始计算
长度: 如果为正, 表示从 start 开始的连续 length 个字符被替换,
如果为负, 表示从 start 开始到倒数第 length 个字符被替换
str_ireplace() 功能同 substr_replace(), 但是该函数不区分大小写
6 其他常用字符串函数
strlen(字符串) 用于计算指定字符串的长度
md5(字符串, 标志) 将一个字符串进行 MD5 算法加密
第二个参数如果为 true, 将返回一个 16 位的二进制数; 如果为 false, 则返回一个 32 位的十六进制字符串, 默认为 false
七 PHP 中的面向对象编程技术
1 对象的特性
封装: 对象是封装的最基本单位, 是以对象名封装的数据结构以及可施加在这些数据上的操作的集合
就像一个盒子, 我们不需要知道盒子里面有什么东西, 只需知道它有哪些用途即可
继承: PHP 不支持多重继承, 继承本质上就是代码重用, 继承是指子类可以自动地拥有父类的全部特性, 而无须从零开始构建
多态: 能够使用类的上下文来重新定义或改变类的行为多态性使得对象能够根据所得到的参数决定具体执行哪个行为或方法, 而对外却可以提供统一的接口
2 类的结构
class 类名
- {
- // 定义属性, 使用关键字 var
- var $var1;
- var $var2;
- ...
- // 定义方法, 使用关键字 function
- function method1(...){...}
- function method2(...){...}
- ...
} 不可以将一个类分开定义到多个 PHP 标记对中, 更不可以分开定义到多个文件中
3 类的实例化
使用关键字 new 来创建类的实例
$ 实例名 = new 类名;
4 使用类的属性
若要使用类中定义的属性或方法, 只需使用运算符 "->" 即可如果在类定义时需要访问类内部自身定义的属性或方法, 则需要使用 $this 指针
一般来说, 从类的外部直接访问类的属性存在一定的风险, 为此 PHP 对于访问类属性提供了一些保护措施__set(),__get(), 当视图引用一个
类中不存在的属性时, 就会调用这些方法进行相应的处理
5 类的访问控制 控制类的属性和方 法
如果对类的属性指定了访问控制类型, 则关键字 var 需省略
public 在类的内部和外部都可以访问该选项是默认选项
使用:: 运算符可以在没有创建任何类的实例的情况下访问类中的函数或者变量
格式如下: 类名:: 函数类名:: 变量
private 只能在类的内部进行访问
protected 只能在该类和其子类中使用
6 构造函数
构造函数在一个类被实例化时自动调用 PHP 不支持多个构造函数
构造函数的语法格式如下: function __construct(参数 1, 参数 2,...){}
7 析构函数
析构函数会在类对象被销毁前调用, 通常用来设定对象被销毁前需要完成的一些操作销毁对象最简单的方法是直接对其赋值 NULL
析构函数语法: function __destruct(){}
脚本在执行结束时, PHP 会自动销毁内存中的所有对象因此, 对于一般的类对象不需要显式地定义析构函数
但是如果类对象在实例化时创建了不太容易销毁的数据, 如果数据存储在数据库中而不是内存中, 就应当定义一个析构函数, 在类
对象销毁时使这些数据能够正常被销毁
8 静态属性和方法
静态属性和方法需要使用关键字 self:: 来引用, 其他介绍前文已有
9 类运算符 instanceof
可以判断一个对象是否是一个类的实例
10 继承已有的类
继承使用关键字 extend
11 类的重载
重载是指在子类中再次定义与父类相同的属性和方法类的重载使得在子类中可以给某个属性赋予一个与其父类中不相同的值,
也可以给某个方法指定一个与其父类中不相同的功能
12 访问父类中的属性和方法
一个子类可以通过继承和重载得到父类中的属性和方法, 并能够重写所继承的属性和方法但有些时候, 在子类中会需要直接
调用父类中的方法在 PHP 中可以使用关键字 parent:: 来实现对父类中属性和方法的访问
13 使用 final 关键字禁止继承和重载
当在一个函数定义前面使用关键字 final 时, 表示该函数将不能被任何子类重载
如果不希望让一个类继承, 只需在定义类时为其添加 final 关键字
如果一个类中的属性或方法被指定为 private, 则该属性或方法将不能被继承
如果一个类中的属性或方法被指定为 protected, 则该属性或方法可以被子类继承, 但不能在类外部直接访问
如果一个类中的属性或方法被指定为 public, 则该属性或方法不仅可以被子类继承, 而且在任何地方都可以被访问
14 抽象类和抽象方法
抽象类是不能实例化的类, 只能作为其他类的父类使用所以继承抽象类的子类都必须实现所有的抽象方法
在 PHP 中使用关键字 abstract 定义一个抽象类和方法
15 接口
接口是一种特殊的抽象类, 这种抽象类中通常只包含抽象方法, 不定义属性属性的定义和抽象方法的实现交给实现接口的类来完成
定义接口使用关键字 interface 实现接口使用关键字 implements
16 实现多个接口
PHP 中的类不允许多重继承, 但允许实现多个接口
17 对象的赋值
目标对象 = clone 原对象; 复制后两个对象完全一样, 但互不干扰
在 PHP 中还可以使用__clone() 方法调整对象赋值的行为默认情况下, 该函数将建立一个与原对象拥有相同属性和方法的对象, 如果希望
在赋值后改变原对象中的某些内容, 只需在方法中重写原对象中的相应的属性和方法即可该方法可以使用 $this 指针
18 自动加载类
PHP 专门提供了__autoload() 函数, 来自动加载所需的类
在需要加载时, 该函数会自动被调用, 同时类名会以参数的形式传递给__autoload() 函数
19 处理不存在方法调用
当调用类中一个不存在的方法将会产生致命错误, PHP 提供了__call() 方法可以对这种类型的错误进行处理
20 对象的序列化
为了方便变量的传输和存储, 通常会在传输和存储变量前将其转化成为字符串的字节流形式, 在需要使用这些变量时, 再将其还原为
原来的变量, 这个过程成为序列化和反序列化
为了方便传输和存储类对象, 也可以对齐进行序列化和反序列化处理 PHP 中使用函数 serialize() 来序列化一个对象, 其参数为对象名,
返回值为序列化后得到的字符串反序列化使用 unserialize() 函数, 其参数为字符串, 返回原来的对象
对象在序列化的时候, 会自动调用一个名为__sleep() 方法, 完成一些睡前的事情, 该方法不接收任何参数, 但会返回一个数组, 数组中
指定需要序列化的属性, 未被包含的属性将在序列化时被忽略如果没有指定__sleep() 方法, PHP 将对所有的属性进行序列化
对象在反序列化时, 会自动调用一个名为__wakeup() 的方法, 做一些对象醒来就要做的动作
八 PHP 访问 MySQL 数据库
1 数据库操作的基本步骤
链接数据库服务器 mysql_connect(MySQL 服务器主机名, 用户名, 密码);
选择一个数据库 mysql_select_db(数据库名, 资源标识);
对数据库进行操作 mysql_query(数据库语句, 资源标识);
对数据记录进行处理 mysql_fetch_row(资源标识);
2 连接和关闭数据库
$connect = mysql_connect("localhost","root","123456");
在结束对数据库的操作之后, mysql_connect() 会自动断开连接, 也可以显式地使用 mysql_close() 断开连接
mysql_pconnect() 建立的是一种持久连接, 一旦建立连接, 连接将被放到连接池中, 即使数据库操作结束也
不会自动关闭连接, 而是留待以后使用即使使用 mysql_close() 函数也无法关闭由函数 mysql_pconnect() 建立
的连接
完成数据库操作后, 应当关闭连接但关闭不是必需的, 因为 PHP 具有垃圾回收功能, 会自动对不用的连接进行
处理当然可以显式地关闭连接, 关闭连接需要资源标识号, 如果没有指定, 则默认关闭最近打开的连接
mysql_close(资源标识号);
3 选择数据库
选择数据库 mysql_select_db(数据库名, 资源标识号);
4 查询数据库
执行查询操作的函数有 mysql_query() 和 mysql_db_query() 其中函数 mysql_query() 直接执行一个 SQL 语句,
而函数 mysql_db_query() 可以在指定数据库上执行 SQL 语句
mysql_query(SQL 语句, 资源标识号):
如果 SQL 语句是 selectshowexpllaindescribe 等查询语句, 则执行成功时将返回一个资源标识号, 失败时返回 false
如果 SQL 语句是其他语句 (insertupdatedelete 等), 成功时返回 true, 失败时返回 false
mysql_db_query(数据库名, SQL 语句, 资源标识号) 功能同上, 此句相当于 mysql|_slect_db() 和 mysql_query() 的组合
5 获取和显示数据
mysql_fetch_row(资源标识号) 以数组的形式返回查询结果集中的当前记录行, 并在调用后将结果集中的当前行指针下移一行
mysql_fetch_array(资源标识号) 以数组的形式返回查询结果集中的当前记录行, 并在调用后将结果集中的当前行下移一行
NOTE:mysql_fetch_row() 返回的结果数组只能使用数字下标进行访问, mysql_fetch_array() 返回结果数组可以使用数组下标,
也可以使用字段名进行访问, 不过 mysql_fetch_row() 可以得到最快的执行速度
mysql_fetch_assoc(资源标识号) 以关联数组的形式返回查询结果集中的当前记录行, 并在调用后将结果集中的当前行指针下移一行
mysql_fetch_object(资源标识号) 以对象的形式返回查询结果集中的当前记录行, 并在嗲用后将结果集中的当前行指针下移一行
mysql_result(资源标识号, 行号, 字段) 字段可以使用数字索引, 也可以使用字段名数字索引下标从 0 开始
该函数返回指定记录行的指定字段的值
mysql_num_rows(资源标识号) 返回符合查询条件的记录行数
mysql_field_seek(资源标识号, 定位的行号) 定位到要查询的行
mysql_fetch_length(资源标识号) 以数字索引数组的形式返回, 且每个数组元素值对应一个字段的字节数
6 数据的增删改及相关操作
使用 mysql_query() 完成数据的增删改操作
int mysql_affected_rows(资源标识号) 返回受 insertupdate 和 delete 影响的记录数
mysql_num_rows() 仅对 select 语句有效
来源: https://www.php1.cn/detail/php-3ef74f294a.html