特点
- 变量: 变量前加上
$ 以标识
- 弱类型语言: 无需声明变量的数据类型, 直接赋值即可(变量在第一次赋值时被创建), 可以改变变量的数据类型
- 除法结果: 两个整数相除可能会有浮点型结果
文件
- 扩展名: .php
- 内容: PHP代码是插入在html里的, php代码的输出实质是 将输出内容插入到html的对应位置(PHP代码所在的位置)
- 区分PHP代码: PHP代码以
<?php 开始, 以 ?> 结束
操作
- 注释: 单行
// 多行/**/
- 函数**定义:
function 函数名(形参,...){函数体}形参默认值: 通过 在形参后加上赋值号以及对应默认值 来声明 (设置了默认值的形参必须放在所有形参最后) 调用: 函数名(实参,...)变量函数**: 若 $a 存储的值为某函数名func(字符串), 则可用$a在语句中替代 func 如 可通过 $a(实参,...) 来调用func函数, 若func 为 类b 的方法名(字符串), 则可通过$类b的实例变量->$a(实参,...) 来调用该方法
- 条件语句: 注: switch语句比较使用的是弱比较
if (condition){
// 代码块1
}
elseif (condition){
// 代码块2
}
else{
// 代码块3
}
-- -- -- -- -- -- --
switch (expression) {
case value1:
// 代码块1
break; // 可选,若没有break,会执行后面的case语句
case value2:
// 代码块2
break; // 可选,若没有break,会执行后面的default语句
default:
// 代码块3
}
while (condition) {
// 代码块
}
-- -- -- -- -- -- -- --
do {
// 代码块
}while(condition);
-- -- -- -- -- -- --
for (初始化; condition; 更新) {
// 代码块
}
-- -- -- -- -- -- -- --
foreach (数组 as [键变量 => ]值变量){
// 数组元素的键与值就都会被赋值给 键变量 和 值变量, 直到被遍历
}
-- -- -- -- -- -- -- --
break 跳出最里层的一层循环
continue 跳转到下一次循环
echo <字符串>,...
echo(<字符串>,...)
print <字符串>
print(<字符串>)
介绍:echo和print都是一种语言结构(所以括号可选),区别于print只能输出一个参数,而echo能输出多个
变量
- 四种作用域**全局作用域(全局变量): 在所有函数外定义的变量, 要想在函数内调用全局变量, 需要在函数内用
global $变量名,...;声明使用的是全局变量 或者通过使用$GLOBALS数组取出全局变量 局部作用域(局部变量): 在函数内定义的变量 Static作用域: 通过 static $变量名,...; 在函数内声明, 函数执行过后该变量的值将保留(即每次调用该函数时, 该变量将会保留着函数前一次被调用时的值) 参数作用域**: 在形参中定义的变量
- 定义常量: 通过
const 常量名=值; 声明 或 使用 define() 函数 引用: 无需 $ 符号 作用域: 常量具有全局作用域, 但在函数中可以直接被引用, 无需 global 关键词 数据类型: 可为 字符串 整形 浮点数 布尔值 数组(PHP>7), 其它数据类型不行, 且const赋的值只能是字面量或常量(不能是变量), define赋的值可以是变量
- 变量函数: 若
$a 存储的值为某函数名func(字符串), 则可用 $a 在语句中替代 func 如 可通过 $a(实参,...) 来调用func函数, 若func 为 类b 的方法名(字符串), 则可通过 $类b的实例变量->$a(实参,...) 来调用该方法
- 变量类: 若
$a 存储的值为某类名Cls(字符串), 则可用 $a 在语句中替代 Cls 如 可通过 new $a(实参,...) 来创建实例, 通过 $a::类常量/静态属性/静态方法(实参) 来访问静态属性/静态方法/类常量
- 销毁变量
$a = NULL 将变量置空, 单变量仍存在于作用域中 unset($a) 彻底销毁变量 (unset)$a 变量值不变, 只是将返回值设为NULL(PHP>7.2后该用法被废弃)
数据类型
- 八种数据类型: string(字符串) Integer/int(整形) float/double(浮点型) Boolean/bool(布尔型) array(数组) object(对象) NULL(空值) resource(资源类型)
- 字符串: 单双引号: 单引号字符串只识别
\' \\ 转义字符, 双引号字符串只不识别 \' 转义字符 双引号字符串内可插入并识别变量(单引号不行) 连接: 使用并置运算符 . 点号, 生成两个字符串连接的新字符串(可用复合赋值运算符.=)
- 整形: 可以由 十进制 十六进制(0x开头) 八进制(0开头) 二进制(0b开头) 表示 (当PHP>8.1.0时, 八进制可以用
0o 或 0O 开头) PHP>7.4.0时, 整形数值可以插入 _ 符来使整形更直观,不会影响具体数值 (如 1_234_567)
- 浮点型: 可以由指数表示
<数字1>e<数字2> 代表 数字1 * 10^数字2
- 布尔型: true 与 false 类型转换成bool为false的数据: 布尔值false 整形0 浮点型0.0和-0.0 空字符串"" 字符串"0" 空数组(不含任何元素) NULL(包括未赋值变量) 内部对象的强制转换行为重载为 bool (其他值都被认为是true, 包括NAN -1)
- NULL: 不区分大小写, 常通过将变量的值赋值为NULL来清空变量
$a = NULL 将变量置空, 单变量仍存在于作用域中 unset($a) 彻底销毁变量 (unset)$a 变量值不变, 只是将返回值设为NULL(PHP>7.2后该用法被废弃)
- 手动类型转换: 变量前加上
(数据类型)
- 自动类型转换条件判断语句传入值非bool时, 会自动将其转化为bool值 当给定的 整形数值/表达式整形结果 超出int范围, 会被转化为float
运算符
- 算数运算符:
加+ 减- 乘* 除/ 取模% 及其 复合赋值运算符 += -= *= /= %=
- 递增/递减运算符:
++x --x y++ y--
- 比较运算符:
等于== 强等于=== 不等于!= 强不等于!== 大于> 小于< 大于等于>= 小于等于<=
- 逻辑运算符:
与 and &&; 或 or ||; 异或 xor; 非 ! (and or 与 && || 优先级不同)
- 字符串连接运算符:
连接. 连接后赋值.=
- 数组运算符:
求并集+ 和 相等== 恒等=== 不相等!= 不相等<> 不恒等!== (!=与<>效果相同)
- 三元运算符:
表达式1 ? 表达式2 : 表达式3 (PHP>5.3时, 可省略表达式2, 则表达式1为true时 返回表达式1)
- 组合比较符:
$a <=> $b (若a>b, 返回1; a==b,返回0; a<b,返回-1)
- 位运算符:
与& 或| 异或^ 取反~ 左移<< 右移>> 及其复合赋值运算符(略)
数组
- 分类: 数值数组(键为数字ID) 关联数组(键为指定的数据)
- 数值数组: 定义:
$变量名 = [元素1,...]; 或 $变量名 = array(元素1,...);引用: $数组变量[数字下角标]
- 关联数组: 定义:
$变量名 = [元素名1=>值1,...]; 或 $变量名 = array(元素名1=>值1,...);引用: $数组变量[元素名]元素名: 可以为 整数; 字符串; 浮点数(会自动转化为整数-直接去小数); 布尔值(true false 自动转化为1 与 0); NULL(被自动转化为空字符串"");
- 二维数组: 数值数组 关联数组 都可以定义多维数组
对象
- 访问修饰符**public/var 可以在任何地方被访问 protected 可在所在类 及其子类和父类被访问 private** 只能在所在类中被访问
- static修饰符: 用于定义 静态属性/静态方法 在所在类中, 静态方法无法使用
$this关键词, 只能访问类中的 类常量/静态属性/静态方法
- final修饰符: 类 - 不能被继承; 方法 - 子类不能重写该方法
- 类定义:
[final] class 类名{类体}属性: 修饰符 $变量名 [= 值];类常量: const 常量名 = 值; (常量默认是public的) 方法: 修饰符 function 函数名 (形参,...) {方法体}构造函数: __construct (形参,...) {方法体}
- 属性特点: 在php中, 可以动态地为实例添加(所属类原本没定义的)属性
- 重写: 子类重写父类方法时, 方法控制符不能比父类更严格, 形参数量要相同 (若数量多出, 则多出的形参一定要有默认值, 否则报错)
- 重载: PHP不支持重载
- 引用类的属性/方法/类常量**通过类(只能访问静态属性/静态方法/类常量):
类名::类常量/$静态属性/静态方法(实参)通过实例:$实例变量名->属性/方法(实参)(包括静态方法, 静态属性不行) 与 $实例变量名::类常量在所在类中**: $this->属性/方法(实参) (包括静态方法, 静态属性不行) 与$this::类常量self::类常量/$静态属性/静态方法(实参) 或 static::类常量/$静态属性/静态方法(实参)注: PHP中可通过实例来访问 静态方法/属性 以及类常量, 并可改变
- 创建实例:
new 类名(实参)
- 变量类: 若
$a 存储的值为某类名Cls(字符串), 则可用 $a 在语句中替代 Cls 如 可通过 new $a(实参,...) 来创建实例, 通过 $a::类常量/静态属性/静态方法(实参) 来访问静态属性/静态方法/类常量
- 继承与实现:
class 子类名 extends 父类名 implements 接口名,... {类体}特点: 会继承父类/接口的 非private属性与方法 和 常量 (构造函数也会继承) 注: PHP不支持entends多继承, 但可用implements实现多个接口
- this关键字: 代表当前对象实例 (并非代表类自身)
- self关键字: 代表定义所在方法的类
- static关键字: 代表调用所在方法的类
- parent关键字: 在子类中, parent关键字代表父类
- 抽象类与抽象方法**抽象方法定义:
abstract 修饰符 function 函数名(形参); (没有函数体) 抽象方法必须在抽象类里, 抽象类可以包含正常方法与属性: 抽象方法的修饰符不要使用private(因为需要子类访问) 抽象类定义**: abstract class 类名{类体}抽象类不能实例化 继承抽象类时, 子类必须重写父类中的所有抽象方法
- 接口定义:
interface 接口名 {接口体}属性: 接口只能定义常量, 即 const 常量名 = 值方法: 接口中的方法都是抽象方法, 且无需使用abstract关键字, 所有方法会隐式使用public, 且必须使用public修饰符 静态方法: php>=7时, 接口可以定义静态方法(同样必须为public抽象方法) 注: 实现接口的类必须实现(重写)接口的所有抽象方法, 接口不能定义final方法
异常/错误处理
- 错误与异常: 在php中, 由开发者定义与处理的错误即为异常, 由系统定义与处理的即为错误 注: 因为语法错误在代码解析阶段就会报错, 所以无法捕获
- 手动抛出异常/错误:
throw 异常/错误类实例;
- 特点: 异常/错误 都是异常/错误类的实例, PHP所有异常/错误类都继承自Exception/Error类 Error类从php7开始出现, 所以php7以前无法 手动抛出错误, 无法 捕获错误
try{
#包含可能会抛出异常/错误的代码
#当抛出异常/错误时程序会立即跳转到相应的catch块(若抛出了异常/错误但没被catch块捕获,则会在finally块执行完后报错)
}
catch (异常/错误类 $变量名) {
#用于捕获和处理try块中抛出的异常/错误
#当抛出的异常/错误是catch中声明的异常/错误类或其子类的实例,则将异常/错误传入变量中,并执行catch块
# 一个异常/错误只能被一个catch捕获,当被捕获时,不再传入后续的catch块
}
catch (异常/错误类 $变量名) {
#代码块
}
...
finally{
#代码块,不论是否抛出异常/错误,都会执行
}
文件包含
- 使用:
include <文件路径>; 和 include_once <文件路径>;require <文件路径>; 和 require_once <文件路径>;include系列 在文件包含失败时 会生成警告(E_WARNING), 脚本继续执行 require系列 在文件包含失败时 会生成致命错误(E_COMPILE_ERROR), 脚本停止执行 once系列 检测到目标文件 在前面已经被脚本包含过一次时, 不在执行包含 (非once系列 会执行)
- 路径: 若文件路径只有文件名, 则先在 include_path 指定目录中寻找, 若未找到再在文件所在目录中寻找 (如果文件路径中包含了目录, 无论是以
/开头的绝对路径, 还是以./或../开头的相对路径, 都不会在include_path中寻找) (待定)
- 作用: 相当于
?>文件内容<?php, 将文件内容插入 文件包含语句所在位置
- 特点: 这四个都是语言结构, 括号可选