文章目录
PHP 语言标记
因为 PHP 是兼容当时的主流语言, 所以 PHP 有四种标记方式:
<?php PHP 代码 ?>
。这是 PHP 最为正宗的语言标记, 称为标准风格标记、XML 风格标记等, 推荐使用<? PHP代码 ?>
。这是 PHP 语言标记的简便写法, 称为短风格标记, 不建议使用, 因为能在 Apache 中禁用这种标签<% PHP代码 %>
。这是为了兼容习惯了 ASP 和 JSP 的程序员, 称为 ASP 风格标记, 不建议使用, 能在 Apache 中禁用, 并且和 ASP、JSP 区分度不高<script language="php"> PHP 代码 </script>
。这是为了兼容习惯了 JavaScript 的用户, 称为长风格标记, 不建议使用, 冗长并且失去了 PHP 可以随意放置在任意地方的特性, 只能嵌入 HTML 中, 而不能在标签中使用
注释
PHP 的注释也是参照主流的开发语言设置的, 也含有兼容其他语言的部分, 其注释类型主要有以下四种:
//(单行注释)
。注释掉 “//” 后面的所有内容(包括其他注释符)/* 注释内容 */
(多行注释)。注释掉符号内包裹的所有内容, 不能嵌套, 也不能和文档注释混用/** 注释内容 */
(文档注释)。作用和多行注释一样, 但可以被提取出来形成帮助这一类东西# 注释内容
(脚本注释)。作用和单行注释一样, 目的是兼容有这种习惯的开发者
PHP 编程规范
两个空行
- 一个源文件的两个代码片段之间
- 两个类的声明之间
一个空行
- 两个函数声明之间
- 函数内的局部变量和函数的第一条语句之间
- 块注释或单行注释之前
- 一个函数内的两个逻辑代码段之间
空格
- 空格一般应用与关键字与括号之间, 但是函数名称与左括号之间不加空格
- 一般在参数列表中的逗号后面加上空格
- 数学算式的操作数和运算符之间应添加空格(二进制运算与一元运算符除外)
- for 语句中的表达式应该用分号分开, 后面添加空格
- 强制类型转换语句中的强制类型的右括号与表达式之间应该添加空格
变量
PHP 与 JavaScript 一样, 是一种弱类型的编程语言, 也就是说, 不必在定义 PHP 变量时就声明其类型。
- 使用规则: 使用时必须在变量名前面加上 “$” 符号, 否则不会当做变量处理
- 声明规则: 声明变量时也需要加 “$”, 声明时必须赋值, 系统会根据值来设置变量类型
可变变量
PHP 可以将某个变量的值做为变量名, 如: $a = ‘b’;, KaTeX parse error: Can't use function '$' in math mode at position 8: a 就是代表 $̲b, 如果修改 $a 的值, a 需要重新定义, 但是 $b 仍然可以使用
变量的引用
PHP 的变量引用是将两个变量关联起来, 并不是两个变量对应同一块内存空间, 删除其中一个变量不会对另一个变量产生任何影响, 只是少了关联关系而已
命名规则
- 可以使用系统关键字为变量命名, 因为 PHP 的变量都带有 “$”, 可以区分关键字与变量
- 不能以数字开头
- 不能含有 PHP 的运算符, 如: “+”、“-”、“*”、"/"等
- PHP 只有变量和常量区分大小写, 其余不区分
数据类型
PHP 提供了 8 种基本的数据类型, 分为: 标量类型(1-4)、复合类型(5-6)、特殊类型等(7-8)
- 整型: int、integer、long
- 布尔型: bool、boolean(与 bool 相同, 兼容程序员习惯)
- 浮点型: float、double、real(real 似乎可以和 double 等价, PHP 并没有规定它们的精度区别)
- 字符串: string
- 数组: Array
- 对象: Object
- 资源类型: resource
- 空类型: NULL(变量为空即代表变量不存在)
数据类型补充说明
与布尔 false 相等的值
- false("false"为 true)
- 0
- 0.0
- " “或者"0”
- 没有成员变量的数组(array())
- 没有单元的对象(仅适用于 PHP4)
- 特殊类型 NULL(包括尚未设定的变量)
整型的数据溢出
整型数值最大范围为 ±2147483647, 如果用超出范围的数赋值给整型变量, 整型变量会提升为 float, 如果强制使用 int 存储, 则溢出的部分重新加在最小值处, 直至最后的值在整型数据区间内为止, 此时的值为该数的 int 型数据
浮点类型的精度
浮点型最大精度为小数点后15位, 永远不要相信浮点数结果精确到了最后一位, 也永远不要比较两个浮点数是否相等
字符串中的变量解析
假设有一个变量 b e e r , 我们需要输出 " beer, 我们需要输出 " beer,我们需要输出"beers", 此时不是解析成变量 $beer, 而是解析成 $beers, 要解析成 KaTeX parse error: Expected '}', got 'EOF' at end of input: beer 的话可以使用 {beer}s, 或者 ${beer}s
字符串中的定界符
可以使用 “<<<” 后接定界符, 定界符除了不能初始化类成员外, 和双引号作用相同, 定界符的结束符需要在第一列, 如:
$string = <<<EOF
随便写文本
这里的所有文本都将成为变量的值
可以出现任意变量、引号、转义等
EOF;
类型转换
PHP 中有两种类型转换方式, 其中一种为自动转换, 将小的数据类型转换为较大的数据类型时自动发生;另一种为强制转换, 强制转换有三种方式:
- setType(变量名, 类型);。此函数会直接修改变量的数据类型, 是不可逆操作, 有可能丢失精度
- 变量2 = (类型)变量1;。不改变 变量1 的数据类型, 直接将转换后的值赋值给 变量2
- 变量2 = 类型val(变量1);。调用函数, 不改变 变量1 的数据类型, 直接将转换后的值赋值给 变量2。例如: b = i n t v a l ( b = intval( b=intval(a);
与变量有关的函数
- isset(变量);。判断变量是否存在, 如果值为 NULL 也等价于不存在
- unset(变量);。释放变量所占资源
- setType(变量, 类型);。改变变量数据类型
- getType(变量);。获取变量数据类型
- empty(变量);。判断变量是否为空
- var_dump();。输出变量的类型和值
- is_类型(变量);。判断变量是否为某个类型, 如:
is_int()
is_array()
is_resource()
is_scalar()——是否为标量
is_numeric()——是否为数字或数字字符串
is_callable()——判断是否为有效函数名
常量
- 定义: define(“常量名”, 值);
- 使用: 直接使用常量名, 不需要加 “$”
- 命名习惯: 全部大写, 使用 “_” 区分单词
- 常量的类型: 只能是标量类型
- 相关函数: defined(“常量”), 判断常量是否已经定义
- 注意事项: 不能使用 unset() 删除常量;不论何时都不加 “$”
特殊常量
PHP 中的特殊常量有 2 种: 预定义常量、魔术常量。
预定义常量是由系统预先设定好的, 比如说:M_PI: 数学中的 π
魔术常量每次的取值都不相同, 是和运行环境有关的常量, 如:
__FILE__: 取文件全路径名
__LINE__: 取代码行数
__FUNCTION__: 取调用的函数名
PHP_VERSION: 取当前 PHP 版本
## 运算符 ##
- 算数运算符: +、-、*、/、%、++、–
- 字符串运算符: .
- 赋值运算符: =、+=、*=、/=、%=、.=
- 比较运算符: >、<、>=、<=、、!=、<>、=、!==
- 逻辑运算符: &&、and、||、or、!、nor、&、|、!
- 位运算符: &、|、^、~、<<、>>、>>>
- 其他运算符: ?:、``、@、=>、->、::、&、$
其中: - % 的作用: 整除、控制范围(10-90)
- % 的注意事项: 不要用小数和负数, % 会把两边的数转化为整数再操作
- . 的作用: 连接字符串
- === 的作用: 全等于。比较时不仅值要相同, 类型也要相同, 才能为真
- !== 的作用: 全不等。值不同或类型不同都为真。
- != 和 <>、&& 和 and、|| 和 or、! 和 not 等价
- ?: 的作用: 条件?为真执行的语句:为假执行的语句
- ^ 的作用: 异或。左右相同则为假, 不同为真
- `` 的作用: 将其中的语句当做 shell 执行
- @ 的作用: 屏蔽警告和错误
结构
顺序结构
自上而下执行就是顺序结构
分支结构
- 单路分支: if
- 双路分支: if-else
- 多路分支: if-else if、switch
- 嵌套分支: if-else{if-else}
循环结构
- while 循环: 适合做条件循环(先判断再循环)
- do-while 循环: 适合做条件循环(先循环再判断)
- for 循环: 适合做计数循环
与结构有关的命令
- break: 退出循环或 switch 语句
- continue: 到循环体的尾部, 直接进入下一次循环
- exit: 退出程序
- return: 返回
函数的定义
声明:
function 函数名([参数1, 参数2...])
{
函数体;
返回值;
}
注意事项:
- 声明函数时不需要给参数加上数据类型, 并且 PHP 中参数的个数是否匹配都能调用这个函数, 所以 PHP 中没有函数重载的概念
- PHP 代码可以在任意位置声明, 默认可以作用于整个页面, 所以 PHP 函数可以先使用后声明
变量的作用范围
- 局部变量: 在函数中声明的变量, 只能在函数体内起作用
- 全局变量: 在函数外声明的变量, 可以在整个页面使用, 甚至可以在同个页面、不同<?php ?>标签对中使用
- 静态变量: 只能在函数、类中声明, 不能是全局的, 声明时使用 static 修饰
- 变量函数: 存储的是函数, 当使用 “$变量名([参数1, 参数2…])” 时, 调用变量所装的函数, 能做到类似于多态的效果;如果直接使用变量, 则是当做一个存储函数名的字符串变量
- 注意事项
- PHP 无法区分变量是被使用还是声明, 所以当函数内定义的变量和全局变量同名时, 会产生歧义, 到底是定义还是使用?PHP 默认选择是定义新变量
- 在 PHP 函数中使用全局变量的方法: 在使用全局变量前, 再次声明全局变量, 但是需要使用 global 修饰, 作用是告诉 PHP 接下来是使用全局变量而不是定义新变量;或者使用 $GLOBALS[‘变量名’]; 数组
- 静态变量的生命周期和全局变量相同, 不会随着函数的结束而释放。
- 静态变量储存在静态代码段中, 第一次调用函数、类时存储, 接下来只会使用不会重新定义, 也就是说这是有 “记忆功能” 的变量
函数的使用
- 函数的功能: 决定是否使用这个函数
- 函数的参数: 决定怎么使用这个函数
- 函数的返回值: 决定调用后怎么处理这个函数
- 系统函数:
- 常规函数。例如: bool copy(string source, string dest);
- 带 mixed 参数的函数: mixed 表示可以传任意类型的参数。例如: bool chown(string filename, mixed user);
- 带 & 参数的函数: & 表示引用传参, 只能传变量, 不能传值, 传递的变量会发生改变。例如: bool arsort(array &array[, int sort_flags]);
- 带 [] 参数的函数: [] 表示参数可传可不传, 自定义函数时, 可以给参数赋值, 即为默认值, 此时参数变为可选参数, 设置可选参数时, 可选参数必须在参数列表最后。例如: bool arsort(array &array[, int sort_flags])
- 带有 … 参数的函数: … 表示参数个数不限, 可以传任意多个参数, 自定义函数中, 默认可以传任意多个参数。例如: int array_unshift(array &array, mixed var)[, mixed …];
- 回调函数: 带有 callback 参数的函数就是回调函数, callback 参数就是变量函数。例如: array_filter(array input[, callback callback]);
- 补充: 获取多个参数的函数: func_get_args();, 获取参数个数的函数: func_num_args();
- 补充: 使用系统函数调用函数的方法:
- call_user_func_array(“函数名称字符串”[, “参数数组”);
- call_user_func_array(array(“类名”, “类中静态方法名”)[, “参数数组”);
- call_user_func_array(array(对象引用, “对象中方法名”)[, “参数数组”);
- 特殊函数:
- 内部函数: PHP 可以在函数内定义函数, 目的就是让函数只能在函数内部调用, 帮助外部函数完成子功能
- 递归函数: 调用自身的函数, 注意写结束条件
- 重用函数: 顾名思义就是带有多重作用的函数, 在 PHP 中体现为既能作为指令, 也能作为函数。例如: include(效率高, 需要自己检查是否包含多次, 用于包含带有变量的文件)、require(效率高, 需要自己检查是否包含多次, 用于包含固定文件)、include_one(效率低, 只会包含一次, 用于包含带有变量的文件)、request_one(效率低, 只会包含一次, 用于包含固定文件)等等
- 指令和函数的区别:
- 指令的调用: include “文件名”;
函数。例如: include(效率高, 需要自己检查是否包含多次, 用于包含带有变量的文件)、require(效率高, 需要自己检查是否包含多次, 用于包含固定文件)、include_one(效率低, 只会包含一次, 用于包含带有变量的文件)、request_one(效率低, 只会包含一次, 用于包含固定文件)等等
- 指令和函数的区别:
- 指令的调用: include “文件名”;
- 函数的调用: include(“文件名”);