PHP 基础知识

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

注释

#  单行注释
// 单行注释
/**
 * 多行注释
 */

数据类型

  1. 标量类型:Int、Float(Double)、String、Bool。
  2. 复合类型:Array、Object、Callable、Iterable。
  3. 特别类型: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]*$
  1. 可变变量:可以变化的变量,右边变量的值作为左面变量的名。
  2. 可以运用 & 符号引用赋值。
  3. 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 在遍历的时分自身需求履行五个步骤:

  1. 初始化意图,将目标指针指向第一个特点
  2. 判别指针能否有用,存在下一步,不存在则间断
  3. 取出当时指针元素的值存储到变量中
  4. 取出当时指针元素的键存储到变量中
  5. 将取出元素后的指针指向下一个特点

完结了迭代器的类的目标在 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.\'; \'; }