PHP 基础总结

时间:2023-02-01 16:03:02

PHP(Hypertext Preprocessor)是一种被广泛应用的开源通用脚本语言,尤其适用于Web开发。可用于服务端脚本、命令行脚本、桌面应用程序三大领域。

PHP 的 SAPI(服务器应用程序编程接口)提供了一个和外部通信的接口,有点类似于socket,使得PHP可以和其他应用进行交互数据。常见有用于 Apache 的 php5_module、 nginx 的 CGI 、IIS 的 ISAPI、还有 Shell 的 CLI。

CGI(Common Gateway Interface):通用网关接口,它描述了 Web 服务器和请求处理程序(如 PHP)之间数据传输的一个标准协议。请求处理程序也被叫做CGI程序。

FastCGI(Fast Common Gateway Interface):CGI 协议的增強版本,虽然 CGI 协议已经解决了 Web 服务器与 CGI 程序间的通信的问题。可是每一次 Web 请求都会先 fork 出 CGI 程序进程,处理完后结束进程,这种 fork-and-execute 模式非常浪费资源。

PHP-CGI: PHP 官方自带的 FastCGI 管理器。虽然是php官方出品,但是性能太差,而且也很麻烦不人性化,修改 php.ini 配置后需要重启才能生效,无法平滑重启。

FPM(FastCGI Process Manager FastCGI 进程管理器):用于替换 PHP FastCGI 的大部分附加功能,对于高负载网站是非常有用的。支持平滑停止/启动的高级进程管理功能。

PHP 支持数据类型
标量类型(4): boolean、integer、 float(double)、string
复合类型(3): array、object、callable(可调用)
特殊类型(2):resource(资源) NULL(无类型)

伪类型(pseudo-types) :是在 PHP 文档里为了确保代码的易读性,用于指示参数可以使用的类型和值。

总结:
1、字符串有四种表示法:单引号、双引号、heredoc、nowdoc。string 最大可以达到 2GB
1、任何资源和 NAN 都是TRUE,空标记生成的 SimpleXML 对象为FALSE。
2、精度丢失问题用BCMath(任意精度数学库 )
2、数组的键名只能是整型或字符串,布尔值、浮点数、合法的数字字符串都会强转为整型。NULL转为空字符串。
3、其它类型被转换成对象,会创建一个内置类 stdClass 对象实例。
5、资源类型的变量保存了到外部资源的一个引用,它是通过函数来建立和使用的。垃圾回收系统会自动释放无用资源,但持久数据库连接比较特殊。
9、尚未被赋值和被 unset() 的变量都值为 NULL

变量:用美元符号后面跟变量名来表示一个变量,变量名区分大小写。

静态变量:仅在函数作用域中存在,当程序执行离开此作用域时,其值并不丢失。

可变变量:一个变量的变量值却是另一个变量的变量名。如:$a='b'; $$a='bbb'; echo $b;

预定义变量:系统内置变量,PHP会自动将所有的外部变量表示成内建环境变量。
超全局变量
$php_errormsg :前一个错误信息
$HTTP_RAW_POST_DATA : 原生POST数据
$http_response_header :HTTP 响应头
$argc : 传递给脚本的参数数目
$argv : 传递给脚本的参数数组

超全局变量:在全部作用域中始终可用的内置变量。
$GLOBALS : 引用全局作用域中可用的全部变量
$_SERVER : 服务器和执行环境信息
$_GET : HTTP GET 变量
$_POST : HTTP POST 变量
$_FILES : HTTP 文件上传变量
$_REQUEST : HTTP Request 变量
$_SESSION : Session 变量
$_ENV : 环境变量
$_COOKIE :HTTP Cookies

常量: 值不变的量。一旦定义就不能取消和修改,常量的值只能是标量。

魔术常量:__LINE__、__FILE__、__NAMESPACE__、__DIR__、__FUNCTION__、__CLASS__、__METHOD__、__TRAIT__ (都不区分大小写)

表达式: 任何有值的东西。

运算符:可以通过给出的一或多个值来产生另一个值的符号。

递增/递减运算符:递增/递减操作不会影响布尔值。NULL 值递增为 1,递减无效。

错误控制运算符:将 @ 放置在一个 PHP 表达式之前,表示忽略表达式执行的错误信息。

执行运算符:反引号(``)会将其中的内容作为 shell 命令来执行。反引号不能在双引号字符串中使用。

字符串运算符:"." 和 ".=" 用于字符串拼接。

数组相加:数组相加不会覆盖;数组合并(array_merge),字符串键名会覆盖,数字键名则不会。

可变函数:当把变量写成函数调用形式时,PHP 将尝试执行与变量值同名的函数。

匿名函数(Anonymous functions):允许临时创建一个没有指定名称的函数,常用作回调。是通过 Closure 类来实现的。

类常量:在类内部定义为常量。

类的自动加载:通过 spl_autoload_register() 函数注册自动加载器,当使用尚未被定义的类和接口时,会自动加载文件。 注意, __autoload() 函数也能实现,但它以后的版本可能被弃用。

范围解析操作符: 一对冒号(::)用于访问静态成员,类常量。

Trait:实现了一种代码复用的方法,弥补了单继承的不足。

匿名类:PHP 7 开始支持匿名类,它可以创建一次性的简单对象。

重载:重载一般是指,定义多个参数类型或者个数不同,的同名方法。PHP 所提供的重载是通过魔术方法动态地创建类属性和方法。

遍历对象:对象的所有可见属性,才能够被用于遍历为,属性变量名与属性值的键值对。

魔术方法:一些能够在特殊情况下,被自动调用方法被称为魔术方法,如果你想实现相应的魔术功能,可以定义具体实现。

__construct():构造方法
__destruct():析构方法
__call():调用不存在的方法
__callStatic():调用不存在的静态方法
__get():获取不存在的属性
__set(): 属性赋值
__isset(): isset()
__unset():unset()
__sleep() :serialize()
__wakeup() : unserialize()
__toString(): 打印对象
__invoke(): 以函数的方式调用对象
__set_state() :var_export() 导出类
__clone():使用clone 关键字复制对象时,会对对象的所有属性执行一个浅复制。
__debugInfo():var_dump()

类型约束:指定函数的参数限制。必须为对象,接口,数组,或者 callable类型。

对象和引用:默认情况下对象是通过引用传递的,但这又不完全正确。但是官方解释,我没看懂。

序列化:使用函数serialize()来返回一个包含字节流的字符串来表示。

序列化对象:序列化一个对象将只会保存类的名字和对象所以变量,不会保存方法。

命名空间:命名空间是一种封装类的方法,用于防止类名冲突。

错误处理:PHP7 以后,大多数异常被作为 Error 异常抛出,Error 并非继承自 Exception 类。未被处理的 Error 异常,被报告为一个致命错误(Fatal Error)

异常处理:异常可以被try/catch 块所捕获,如果未捕获,则调用异常处理函数(事先通过 set_exception_handler() 注册)进行处理。在PHP 5.5后才能用 finally。

生成器:提供了一种更容易的方法来实现简单的对象迭代,相比于实现 Iterator 接口的方式,性能开销和复杂性大大降低。它还允许你在 foreach 代码块中写代码来迭代返回值。

生成器语法:在函数内部使用 yield 关键字,来生成许多它所需要返回的值。

引用:用不同的名字访问同一个变量内容。引用不是指针。

预定义异常:Exception 和 ErrorException 两个异常类。

预定义接口:
Traversable(遍历)接口
Iterator(迭代器)接口
IteratorAggregate(聚合式迭代器)接口
ArrayAccess(数组式访问)接口
Serializable 序列化接口
Closure 匿名函数类
Generator 生成器类

垃圾回收机制:每个php变量存在一个叫 "zval" 的变量容器中。一个zval变量容器,除了包含变量的类型和值,还包括两个字节的额外信息。is_ref 用来标识这个变量是否是属于引用集合,refcount 表示指向这个zval变量容器的变量个数,这被称作引用计数。当指向变量容器的,变量个数为0时,就会在下一个垃圾回收周期时,被标记为垃圾。一旦根缓冲区满了或者手动调用 gc_collect_cycles() 函数时,就会执行垃圾回收。