PHP 即超文本预处置器,是一种通用开源脚本言语。PHP 是在效力器端履行的脚本言语,是常用的网络编程言语。PHP 原为 Personal Home Page 的缩写,官方于 1998 年 6 月正式发布 PHP 3.0 时更名为:Hypertext Preprocessor。
更多前史查看:https://www.php.net/manual/zh/history.php.php
以下文档根据 PHP8.x 。
官方文档:https://www.php.net/manual/zh/langref.php
标志
1. :XML 风格,建议。纯 php 文件中,完毕标志 ?> 建议省略。 2. :简略风格,不建议。需敞开 php.ini 中的 short_open_tag = on。
参阅文档:https://www.php.net/manual/zh/language.basic-syntax.phptags.php
注释
# 单行注释 // 单行注释 /** * 多行注释 */
数据类型
- 标量类型:Int、Float(Double)、String、Bool。
- 复合类型:Array、Object、Callable、Iterable。
- 特别类型:Resource、Null。
数组
// 界说 # ayyay方法 array($value1, $value2, $value3, ...) array($key1=>$value1, $key2=>$value2, $key3=>$value3, ...) // 界说 # [] 方法 [$value1, $value2, $value3, ...] [$key1=>$value1, $key2=>$value2, $key3=>$value3, ...] // 界说、增加、批改 $arr[] = $value $arr[$key] = $value // 删除 unset($arr[$key]);
目标
PHP 目标是通过 class 界说的。
参阅文档:https://www.php.net/manual/zh/language.types.intro.php
类型转化
可以在要转化的变量之前加上用括号()括起来的意图类型以逼迫转化。
settype() : 设置变量的类型 strval($var) : 将变量转化成字符串 intval($var) : 将变量转化成整型 floatval($var) : 将变量转化成浮点型
常量
PHP 中常量运用 define 或 const 界说。在脚本履行期间该值不能改动。传统上常量总是大写的,由字母或许下划线最初,后边跟上任意数量的字母,数字,或许下划线。可运用如下正则校验:
^[a-zA-Z_\\x80-\\xff][a-zA-Z0-9_\\x80-\\xff]*$
参阅文档:https://www.php.net/manual/zh/language.constants.php
预界说常量
PHP_VERSION : (string) 当时 PHP 版别号,\"主版别号.子版别号.阶段版别号[扩展信息]\"方法。 PHP_MAXPATHLEN (int) : 当时 PHP 版别支撑的最大文件名(包括途径)长度。 PHP_OS : (string) 工作 PHP 的操作体系。 PHP_OS_FAMILY : (string) 工作 PHP 的操作体系宗族。Windows、BSD、Darwin、 Solaris、Linux 或 Unknown 中的一个。 PHP_SAPI : (string) 工作 PHP 的效力器接口类型(Server API)。 PHP_EOL : (string) 当时渠道中关于换行符的界说。 PHP_INT_MAX : (int) 当时 PHP 版别支撑的最大整型数字。 32 位体系中一般为 int(2147483647),64 位体系中为 int(9223372036854775807)。 PHP_INT_MIN : (int) 当时 PHP 版别支撑的最小整型数字。 32 位体系中一般为 int(-2147483648),64 位体系中为 int(-9223372036854775808)。 PHP_INT_SIZE : (int) 当时 PHP 版别的整数大小(以字节为单位)。 PHP_FLOAT_DIG : (int) 可以回来四舍五入为浮点数后不会构成精度损失的小数位数。 PHP_FLOAT_EPSILON : (float) 最小的可表明正数 x,使 x + 1.0 != 1.0。 PHP_FLOAT_MIN : (float) 最小可表明的正浮点数。 PHP_FLOAT_MAX : (float) 最大的可表明浮点数。 DEFAULT_INCLUDE_PATH : (string) PEAR_INSTALL_DIR : (string) PEAR_EXTENSION_DIR : (string) PHP_EXTENSION_DIR : (string) 寻觅可动态加载扩展的默许目录。默许为 PHP_PREFIX 。 PHP_PREFIX : (string) 装备(configure)时设置的 --prefix 值。 在 Windows 上,它是装备(configure)时设置的 --with-prefix 值。 PHP_BINDIR : (string) 装备(configure)时设置的 --bindir 值。 在 Windows 上,它是装备(configure)时设置的 --with-prefix 值。 PHP_BINARY : (string) 脚本履行期间的 PHP 二进制途径。 PHP_LIBDIR : (string) PHP 扩展模块的途径。 PHP_SHLIB_SUFFIX : (string) 构建渠道的同享库后缀,例如 ”so“(大多数 Unix) 或 ”dll“(Windows)。 PHP_FD_SETSIZE : (string) 体系调用的文件描绘符的最大数目。 E_ERROR : (int) 错误报告常量 E_WARNING : (int) 错误报告常量 E_PARSE : (int) 错误报告常量 E_NOTICE : (int) 错误报告常量 ...
参阅文档:https://www.php.net/manual/zh/reserved.constants.php
魔术常量
__LINE__ : 文件中的当时行号。 __FILE__ : 文件的无缺途径和文件名。假设用在被包括文件中,则回来被包括的文件名。 __DIR__ : 文件地点的目录。假设用在被包括文件中,则回来被包括的文件地点的目录。它等价于 dirname(__FILE__)。除非是根目录,否则目录中名不包括结尾的斜杠。 __FUNCTION__ : 当时函数的称谓。匿名函数则为 {closure}。 __CLASS__ : 当时类的称谓。类名包括其被声明的效果域(例如 Foo\\Bar)。当用在 trait 方法中时,__CLASS__ 是调用 trait 方法的类的名字。 __TRAIT__ : Trait 的名字。Trait 名包括其被声明的效果域(例如 Foo\\Bar)。 __METHOD__ : 类的方法名。 __NAMESPACE__ : 当时命名空间的称谓。 ClassName::class : 无缺的类名。
参阅文档:https://www.php.net/manual/zh/language.constants.magic.php
常量函数
constrant() : 获取常量的值 get_defined_constants() : 获取一切已界说的常量列表
变量
PHP 中的变量用一个美圆符号($)后边跟变量名来表明。变量是区分大小写的。由字母或许下划线最初,后边跟上任意数量的字母,数字,或许下划线。可运用如下正则校验:
^[a-zA-Z_\\x80-\\xff][a-zA-Z0-9_\\x80-\\xff]*$
- 可变变量:可以变化的变量,右边变量的值作为左面变量的名。
- 可以运用 & 符号引用赋值。
- PHP 中全局变量在函数中运用时必需声明为 global。
参阅文档:https://www.php.net/manual/zh/language.variables.php
超全局变量
$GLOBALS : 引用全局效果域中可用的全部变量 $_SERVER : 效力器和履行环境信息 $_GET : HTTP GET 变量 $_POST : HTTP POST 变量 $_FILES : HTTP 文件上传变量 $_REQUEST : HTTP Request 变量 $_SESSION : Session 变量 $_ENV : 环境变量 $_COOKIE : HTTP Cookies
参阅文档:https://www.php.net/manual/zh/language.variables.superglobals.php
变量函数
boolval() : 获取变量的布尔值 debug_zval_dump() : 将内部zend值的字符串表明方法转储到输出 empty() : 查看一个变量能否为空 floatval() : 获取变量的浮点值 doubleval() : floatval 的别号 get_debug_type() : 获取更合适 Debug 的数据类型 get_defined_vars() : 回来由一切已界说变量所组成的数组 get_resource_id() : 回来一个整型的资源 ID 值 get_resource_type() : 回来资源(resource)类型 gettype() : 获取变量的类型 intval() : 获取变量的整数值 is_array() : 检测变量能否是数组 is_bool() : 检测变量能否是布尔值 is_callable() : 检测函数在当时环境中能否可调用 is_countable() : 检测变量的内容能否可计数 is_float() : 检测变量能否是浮点型 is_double() : is_float 的别号 is_int() : 检测变量能否是整数 is_integer() : is_int 的别号 is_long() : is_int 的别号 is_iterable() : 检测变量的能否是一个可迭代的值 is_null() : 检测变量能否为 null is_numeric() : 检测变量能否为数字或数字字符串 is_object() : 检测变量能否是一个目标 is_resource() : 检测变量能否为资源类型 is_scalar() : 检测变量能否是一个标量 is_string() : 检测变量能否是字符串 isset() : 检测变量能否已声明并且其值不为 null unset() : 开释给定的变量 print_r() : 以易于了解的格局打印变量。 serialize() : 发生一个可存储的值的表明 unserialize() : 从已存储的表明中创立 PHP 的值 settype() : 设置变量的类型 strval() : 获取变量的字符串值 var_dump() : 打印变量的相关信息 var_export() : 输出或回来变量的可解析字符串表明
参阅文档:https://www.php.net/manual/zh/ref.var.php
运算符
运算符是可以通过给出的一或多个值(表达式)来发生另一个值的东西。
参阅文档:https://www.php.net/manual/zh/language.operators.php
赋值运算符
= : 根本的赋值运算符是“=”,可以与一些其他运算符分离运用。
算术运算符
+$a : 标识,依据状况将 $a 转化为 int 或 float。 -$a : 取反,$a 的负值。 $a + $b : 加法,$a 和 $b 的和。 $a - $b : 减法,$a 和 $b 的差。 $a * $b : 乘法,$a 和 $b 的积。 $a / $b : 除法,$a 除以 $b 的商。 $a % $b : 取模,$a 除以 $b 的余数。 $a ** $b : 求幂,$a 的 $b次方的值。
递加/递加运算符
++$a : 前加,$a 的值加一,然后回来 $a。 $a++ : 后加,回来 $a,然后将 $a 的值加一。 --$a : 前减,$a 的值减一, 然后回来 $a。 $a-- : 后减,回来 $a,然后将 $a 的值减一。
留心:假设递加递加运算符在前,表明先将变量 +1 再运用;假设符号在后,表明先运用变量再 +1。
字符串运算符
. : 联接,回来其左右参数联接后的字符串。 .= : 联接赋值,将右边参数附加到左面的参数之后。
比较运算符
$a == $b : 等于,true,假设类型转化后 $a 等于 $b。 $a === $b : 全等,true,假设 $a 等于 $b,并且它们的类型也相同。 $a != $b : 不等,true,假设类型转化后 $a 不等于 $b。 $a $b : 不等,true,假设类型转化后 $a 不等于 $b。 $a !== $b : 不全等,true,假设 $a 不等于 $b,或许它们的类型不同。 $a $b : 大于,true,假设 $a 严峻大于 $b。 $a = $b : 大于等于,true,假设 $a 大于或许等于 $b。 $a $b : 太空船运算符(组合比较符),当$a小于、等于、大于 $b时 别离回来一个小于、等于、大于0的 int 值。
逻辑运算符
$a and $b : And(逻辑与),true,假设 $a 和 $b 都为 true。 $a && $b : And(逻辑与),true,假设 $a 和 $b 都为 true。 $a or $b : Or(逻辑或),true,假设 $a 或 $b 任一为 true。 $a || $b : Or(逻辑或),true,假设 $a 或 $b 任一为 true。 $a xor $b : Xor(逻辑异或),true,假设 $a 或 $b 任一为 true,但不一起是。 ! $a : Not(逻辑非),true,假设 $a 不为 true。
位运算符(二进制)
$a & $b : And(按位与),将把 $a 和 $b 中都为 1 的位设为 1。 $a | $b : Or(按位或),将把 $a 和 $b 中任何一个为 1 的位设为 1。 $a ^ $b : Xor(按位异或),将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1。 ~ $a : Not(按位取反),将 $a 中为 0 的位设为 1,反之亦然。 $a <> $b : Shift right(右移),将 $a 中的位向右移动 $b 次(每一次移动都表明“除以 2”)。
其他运算符
@ : 错误操控,用于屏蔽单行错误信息,多行错误无效,应尽量少用。 ? : : 三元运算,类似于 if... else ... ?? : null 运算, 假设值为 NULL,则运用后边的默许值。 `` : 履行运算符(反引号),留心这不是单引号!PHP 将测验将反引号中的内容作为 shell 指令来履行,并将其输出信息回来。运用反引号运算符“`”的效果与函数 shell_exec() 相同。 , : 多变量切割符,用于一起界说多个变量。 => : 数组元素拜访符,用于拜访数组内容。 -> : 目标成员拜访符,用于拜访 class 中的成员。
流程操控
参阅文档:https://www.php.net/manual/zh/language.control-structures.php
条件句子(if)
// if 句子 if ( $expr ) { // code... } // 代替语法 # 只能管理之后的一行句子 if ( $expr ) // code...
// if ... else ... 句子 if ( $expr ) { // code... } else { // code... } // 代替语法 # 只能管理之后的一行句子 if ( $expr ) // code... else // code...
// if ... elseif ... else ... 句子 if ( $expr1 ) { // code... } elseif ( $expr2 ) { // coding } else { // code... } // 代替语法 # 可以管理之后的多行句子(留心冒号) if ( $expr1 ): // code... elseif ( $expr2 ): // code... else ( $expr3 ): // code... endif;
条件句子(switch)
// switch ... case ... 句子,懈怠比较(==) switch ( $expr ) { case $value: // code... break; case $value: // code... break; default: // code... }
条件句子(match)
// match 句子,严峻比较(===) $return_value = match ( $expr ) { $single_expr => $return_expr, $conditional_expr1, $conditional_expr2 => $return_expr, } // 代替语法(无)
循环句子(for)
// for 句子 for ( $expr1; $expr2; $expr3 ) { // code... } // 代替语法 # 可以管理之后的多行句子(留心冒号) for ( $expr1; $expr2; $expr3 ): // code... endfor;
// 处置数组 // foreach 句子 # $value 格局 foreach ( $iterable_expr as $value) { // code... } // 代替语法(无) // foreach 句子 # $key => $value 格局 foreach ( $iterable_expr as $key => $value ) { // code... } // 代替语法(无)
循环句子(while)
// while 句子 while ( $expr ) { // code... } // 代替语法 # 可以管理之后的多行句子(留心冒号) while ( $expr ): // code... endwhile;
// do ... while ... 句子 do { // code... } while ( $expr ) // 代替语法(无)
其他句子
break : 完毕履行当时的循环结构。 continue : 越过本次循环中剩下的代码并初步履行下一次循环。 return :将程序操控返还给调用模块 require : 包括并工作指定文件,在出错时发生 E_COMPILE_ERROR 级别的错误 require_once : 和 require 完好相同,独一区别是文件只是包括(require)一次 include : 包括并工作指定文件,在出错时只发生警告(E_WARNING),脚本会持续工作 include_once : 和 include 完好相同,独一区别是文件只是包括(include)一次 goto : 跳转到程序中的指定标志方位,约束较多,慎用 declare : 声明一段代码的履行指令,现在支撑:ticks、encoding、strict_types
函数
参阅文档:https://www.php.net/manual/zh/language.functions.php
- 参数列表以逗号作为分隔符。
- 支撑按值传参,引用传参(&)以及默许参数。也支撑可变长度参数列表(…)和命名参数(?。
- 可运用 return 回来函数履行结果。
- 函数内部界说的变量仅效果在函数内,函数外的变量需求声明全局变量(global)后运用或通过 $GLOBALS 运用。
- 支撑箭头函数语法:fn (arg_list) => expr。
- 支撑变量函数。假设一个变量名后有圆括号,PHP 将寻觅同名函数,并测验履行。
- 支撑递归函数、回调函数及匿名函数。
// 函数结构 function funcName ($arg_1, $arg_2=\'defVal\',/* ..., */ $arg_n) { // code... }
类与目标
每个类的界说都以关键字 class 最初,后边跟着类名,后边跟着一对花括号,里面包括有类的特点与方法的界说。
参阅文档:https://www.php.net/manual/zh/language.oop5.php
- 运用目标运算符(->)拜访非静态特点,示例:$this->property
- 运用规模解析操作符(::)拜访静态特点,示例:self::$property
- 运用 const 界说类常量,类常量普通用大写
- 结构函数:目标初始化,运用预界说方法 __construct()
- 析构函数:销毁目标时自动调用,运用预界说方法 __destruct()
- 运用魔术方法 __clone() 克隆目标
- 运用 public(公有),protected(受保护)或 private(私有)完结拜访操控
- 运用 static 关键字声明类特点或方法为静态,用类拜访而不是目标
- 运用 self 关键字在类的内部代替类名
- 运用 extends 关键字承继类
- 运用 parent 关键字拜访父类成员
- 运用 new 关键字实例化一个类
- 运用 $this 在实例化的目标中拜访目标成员
- 运用 final 关键字润饰类、方法、特点,标识其不可被承继或重界说
- 运用 abstract 关键字声明笼统类或笼统方法,使其只能被承继不能被实例化
- 运用 trait 关键字完结代码的复用
- 运用 interface 关键字可以指定某个类必需完结哪些方法,但不需求界说具体内容
// 类结构 class _ParentClassName { // 常量 const CONSTNAME = \'常量值\'; // 特点 # 类特点必需运用拜访操控操作符 public $varNormal = \'特点值\'; // 静态特点 public static $varStatic = \'静态特点值\'; // 结构函数 function __construct () { // code... } // 析构函数 function __destruct () { // code... } // 方法 public function methodName () { // code... echo \'$varStatic:\'. self::$varStatic .\'
\'; # 防止运用类名直接拜访,后续批改类名招致的错误 echo \'$varNormal:\'. $this -> varNormal .\'
\'; } // 静态方法 public static function methodStaticName () { // code... } } final class _ChildClassName extends _ParentClassName { # 特点 public $varNormal = \'重写特点值\'; # 方法 } $initClass = new _ChildClassName(); $initClass -> methodName();
// 代码复用 trait _TraitName { # 特点 # 方法 }
// 接口 interface _InterfaceName {} class _ClassName implements _InterfaceName {}
Iterator (迭代器)
运用 foreach 遍历目标时会遭到拜访润饰限定符的约束。运用 Iterator 可以批改 foreach 的内部工作机制。foreach 在遍历的时分自身需求履行五个步骤:
- 初始化意图,将目标指针指向第一个特点
- 判别指针能否有用,存在下一步,不存在则间断
- 取出当时指针元素的值存储到变量中
- 取出当时指针元素的键存储到变量中
- 将取出元素后的指针指向下一个特点
完结了迭代器的类的目标在 foreach 的时分,不会按照 foreach 的机制处置,而是调用迭代器的 5 个方法:
- Iterator::rewind : 回来到迭代器的第一个元素
- Iterator::valid : 查看当时方位能否有用
- Iterator::current : 回来当时元素
- Iterator::key : 回来当时元素的键
- Iterator::next : 向前移动到下一个元素
use Iterator; class myIterator implements Iterator { // 索引数组 private $varArray = array( \"第 1 个元素\", \"key\"=>\"第 2 个元素\", \"第 3 个元素\" ); // 5个方法 : 初始化迭代器的第一个元素 public function rewind() { echo __METHOD__ .\'
\'; reset($this->varArray); } // 5个方法 : 查看当时方位能否有用 public function valid() { echo __METHOD__ .\'
\'; return isset($this->varArray[key($this->varArray)]); } // 5个方法 : 回来当时元素 public function current() { echo __METHOD__ .\'
\'; return current($this->varArray); } // 5个方法 : 回来当时元素的键 public function key() { echo __METHOD__ .\'
\'; return key($this->varArray); } // 5个方法 : 向前移动到下一个元素 public function next() { echo __METHOD__ .\'
\'; next($this->varArray); } } $it = new myIterator; foreach($it as $key => $value) { echo $key .\'=>\'. $value .\'
\'; }
Generator (生成器)
生成器是一个类,Generator 完结了 Iterator 接口极点内部方法。
final class Generator implements Iterator { /* 方法 */ public current(): mixed # 回来当时发生的值 public getReturn(): mixed # 获取生成器的回来值 public key(): mixed # 回来当时发生的键 public next(): void # 生成器持续履行 public rewind(): void # 重置迭代器 public send(mixed $value): mixed # 向生成器中传入一个值 public throw(Throwable $exception): mixed # 向生成器中抛入一个反常 public valid(): bool # 查看迭代器能否被封闭 public __wakeup(): void # 序列化回调 }
yield : 生成器会暂停循环履行逻辑,比及运用的时分才再次触发。
// 生成器 echo \'Gererator 生成器
\'; // 生成器生成数组 function getGereratorArr () { for ($i=0; $i<10000; $i++){ yield $i; } } $generatorArr = getGereratorArr(); // Gererator 目标 foreach($generatorArr as $value) { echo $value.\'; \'; }