PHP
PHP(PHP: Hypertext Preprocessor)可以直接嵌入到 HTML 页面的源代码中,使用 <?php 和 ?> 标签。截至 2026 年,PHP 8.5 是最新稳定版本,带来了 URI Extension、Pipe Operator、Clone With 等新特性。本页涵盖 PHP 核心语法,同时标注了 8.0–8.5 引入的重要变化。
参考
PHP 版本速览
| 版本 | 发布 | 关键特性 |
|---|---|---|
| 8.0 | 2020-11 | JIT 编译、Named Arguments、Union Types、Match Expression、Nullsafe Operator |
| 8.1 | 2021-11 | Enums、Fibers、Readonly Properties、Intersection Types |
| 8.2 | 2022-12 | Readonly Classes、DNF Types、Dynamic Properties 废弃 |
| 8.3 | 2023-11 | Typed Constants、#[\Override]、json_validate() |
| 8.4 | 2024-11 | Property Hooks、Asymmetric Visibility、Lazy Objects |
| 8.5 | 2025-11 | URI Extension、Pipe Operator、Clone With、#[\NoDiscard] |
拓展内容列表
重点章节
独特特性
不太理解
安装
现代 PHP 开发推荐使用 PHP 8.4+。以下以 Ubuntu/Debian 为例:
# 安装 PHP 8.4 + 常用扩展
sudo apt install php8.4 php8.4-cli php8.4-mysql php8.4-curl php8.4-mbstring php8.4-xml php8.4-zip
# 验证版本
php -v
# 启动内置开发服务器
php -S localhost:8000
生产环境通常使用 Nginx + PHP-FPM 或 Apache + mod_php。数据库推荐使用 PDO 连接 MySQL(见数据库笔记)。
注意: mysql_* 函数已在 PHP 7.0 中移除。请使用 PDO 或 mysqli_*。
字符
双引号字符串会将转义序列 \r 和 \n 分别解释为 '0x0D' 和 '0x0A'。
"\r\n"
单引号字符串只认识转义序列 \\ 和 \'。
Echo与Print
echo 和 print 区别:
- echo - 可以输出一个或多个字符串
- print - 只允许输出一个字符串,返回值总为 1
- echo 输出的速度比 print 快, echo 没有返回值,print有返回值1。
- print 方便用在更复杂的表达式中:
$ret = print 'Hello World';
同:
- echo 是一个语言结构,使用的时候可以不用加括号,也可以加上括号: echo 或 echo()。
echo ('a'),('b'),('c'); - print 同样是一个语言结构,可以使用括号,也可以不使用括号: print 或 print()。
变量
PHP是一门弱类型语言。
PHP 有四种不同的变量作用域:
- local
- global
- static
- parameter
函数内部声明的是局部变量,仅能在函数内部使用,函数外部声明的变量则有全局作用域。
作用域
global
global 关键字用于函数内访问全局变量。
在函数内调用函数外定义的全局变量,我们需要在函数中的变量前加上 global 关键字:
$x=5;
$y=10;
function myTest()
{
global $x,$y;
$y=$x+$y;
}
myTest();
echo $y; // 输出 15
PHP 将所有全局变量存储在一个名为 $GLOBALS[index] 的数组中。 index 保存变量的名称。这个数组可以在函数内部访问,也可以直接用来更新全局变量。
上面的实例可以写成这样:
<?php
$x=5;
$y=10;
function myTest()
{
$GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
}
myTest();
echo $y;
?>
static
当一个函数完成时,它的所有变量通常都会被删除。然而,有时候您希望某个局部变量不要被删除。
要做到这一点,请在您第一次声明变量时使用 static 关键字:
<?php
function myTest()
{
static $x=0;
echo $x;
$x++;
echo PHP_EOL; // 换行符
}
myTest();
myTest();
myTest();
?>
sortie:
0 1 2
数据类型
- String(字符串)
- Integer(整型)
- Float(浮点型)
- Boolean(布尔型)
- Array(数组)
- Object(对象)
- NULL(空值)
- Resource(资源类型)
PHP var_dump() 函数返回变量的数据类型和值
String
// 嵌入到 HTML 中;将由服务器解释
$uneVariable = "sa valeur"; // 非类型化
echo "Valeur de cette variable : " . $uneVariable;
strlen()函数:
<?php
echo strlen("Hello world!");
?>
strpos()函数,文本查找:
<?php
echo strpos("Hello world!","world");
?>
输出:6
Array
$unTableau = array(1, 2, "trois");
$unTableau[] = 4; // 无需索引插入!
//关联数组
$tabAssociatif = array("cle" => "valeur", "cle2" => 2);
$tabAssociatif["cle3"] = "encore";
echo "<br><br>tableau:<br>";
for ($i = 0; $i < count($unTableau); $i++)
echo "\t" . $unTableau[$i]; // 1 2 三 4
echo "<br><br>tab associatif:<br>";
foreach ($tabAssociatif as $nextCle => $nextVal)
echo "<br>" . $nextCle . "\t" . $nextVal;
count(),获取数组长度:
<?php
$cars=array("Volvo","BMW","Toyota");
echo count($cars);
?>
返回3
- 遍历数组使用for或foreach
- foreach A as B语法接近于python的for B in A
对象与类
OOP 完整内容(类、继承、接口、Trait、枚举、构造器提升等)已移至 PHP 面向对象。
资源类型
<?php
$fp = fopen("foo","w");
echo get_resource_type($fp)."\n";
// 打印:file
?>
注意: mysql_connect() 在 PHP 7.0 中已被移除。现代代码使用 PDO 或 mysqli。
数据类型比较
- 松散比较:使用两个等号 == 比较,只比较值,不比较类型。
- 严格比较:用三个等号 = 比较,除了比较值,也比较类型。
常量
常量默认是全局变量。
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
- name:必选参数,常量名称,即标志符。
- value:必选参数,常量的值。
- case_insensitive :可选参数,如果设置为 TRUE,该常量则大小写不敏感,默认是大小写敏感的。
<?php
// 区分大小写的常量名
define("GREETING", "欢迎访问 Runoob.com");
echo GREETING; // 输出 "欢迎访问 Runoob.com"
echo '<br>';
echo greeting; // 输出 "greeting",但是有警告信息,表示该常量未定义
?>
不区分大小写:
<?php
// 不区分大小写的常量名
define("GREETING", "欢迎访问 Runoob.com", true);
echo greeting; // 输出 "欢迎访问 Runoob.com"
?>
运算符
+-*/
~取反
整除intdiv()
<?php
var_dump(intdiv(10, 3));
?>
得到int(3)
递增递减运算符
- ++x
- x++
- --x
- x--
比较运算符
- = 绝对等于,要求类别也相同
- !=
- <> 不等于
- ! 不绝对等于
- >
- <
- >=
- <=
逻辑运算符
支持类C++与类python两套逻辑运算符。
- and
- or
- xor
- &&
- ||
- !
数组运算符
- +
- ==
- =
- !=
- <>
- !
三元运算符?:
判断 $_GET 请求中含有 user 值,如果有返回 $_GET['user&39;],否则返回 nobody
<?php
// 普通写法
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
echo $username, PHP_EOL;
// PHP 5.3+ 版本写法
$username = $_GET['user'] ?: 'nobody';
echo $username, PHP_EOL;
?>
并置运算符.
<?php
$txt1="Hello world!";
$txt2="What a nice day!";
echo $txt1 . " " . $txt2;
?>
语法结构
if...elseif...else
switch(expression){
case value1:
break;
//
default:
}
while
- while
- do...while
- for
- foreach
函数
function puissance($x, $exposant = 2) {
return pow($x, $exposant);
}
$a = puissance(2); // 4
$b = puissance(2, 3); // 8
echo "<br>2^2=".$a."<br>2^3=".$b;
加载库:include("path_to_library.php")
排序
- sort() 升序
- rsort() 降序
- asort() 关联数组值升序
- ksort() 关联数组键升序
- arsort()
- krsort()
常用函数
isset()documentation Returns true if var exists and has any value other than null. false otherwise.var_dump(mixed $value, mixed ...$values): voiddocumentation Dumps information about a variablestring shell_exec ( string $cmd )string exec ( string $command [, array &$output [,int &$return_var ]] )documentationprint_r(mixed $value, bool $return = false): string|booldocumentation- print_r() displays information about a variable in a way that's readable by humans.
die("")equivqlent toexit("")addslashes()pour banalisererror_reporting()$contenu = htmlentities($contenu);prevent script or other html element in the content from being identified
<?php
$a = array(1, 2, array("a", "b", "c"));
var_dump($a);
?>
<?php
$b = 3.1;
$c = true;
var_dump($b, $c);
?>
结果为:
//1
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
array(3) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[2]=>
string(1) "c"
}
}
//2
float(3.1)
bool(true)
变量函数
将一个变量作为函数名来调用的函数。
<?php
function foo() {
echo "In foo()<br />\n";
}
function bar($arg = '')
{
echo "In bar(); argument was '$arg'.<br />\n";
}
// 使用 echo 的包装函数
function echoit($string)
{
echo $string;
}
$func = 'foo';
$func(); // 调用 foo()
$func = 'bar';
$func('test'); // 调用 bar()
$func = 'echoit';
$func('test'); // 调用 echoit()
?>
也可以用变量函数的语法来调用一个对象的方法。
<?php
class Foo
{
function Variable()
{
$name = 'Bar';
$this->$name(); // 调用 Bar() 方法
}
function Bar()
{
echo "This is Bar";
}
}
$foo = new Foo();
$funcname = "Variable";
$foo->$funcname(); // 调用 $foo->Variable()
?>
passage par référence引用
function foo(&$var)
{
$var++;
}
$a=5;
foo ($a);
默认值
使用=指定
魔术常量
值随其在代码中的位置而变化。
__LINE____FILE____DIR____FUNCTION____CLASS____TRAIT__:PHP5.4__METHOD__:类的方法句__NAMESPACE__:当前命名空间的名称
trait
<?php
class Base {
public function sayHello() {
echo 'Hello ';
}
}
trait SayWorld {
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
class MyHelloWorld extends Base {
use SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
?>
返回Hello World!
NameSpace
<?php
namespace MyProject;
echo '命名空间为:"', __NAMESPACE__, '"'; // 输出 "MyProject"
?>
命名空间
用于解决重名问题。
<?php
declare(encoding='UTF-8'); //定义多个命名空间和不包含在命名空间中的代码。
//声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前。
namespace MyProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
namespace AnotherProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
?>
namespace { // 全局代码
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>
以下代码会出现语法错误:
<html>
<?php
namespace MyProject; // 命名空间前出现了“<html>” 会致命错误 - 命名空间必须是程序脚本的第一条语句
?>
子命名空间
<?php
namespace MyProject\Sub\Level; //声明分层次的单个命名空间
const CONNECT_OK = 1;
class Connection { /* ... */ }
function Connect() { /* ... */ }
?>
超级全局变量
- $GLOBALS
- $_SERVER
- $_REQUEST:预定义的 $_REQUEST 变量包含了 $_GET、$_POST 和 $_COOKIE 的内容。$_REQUEST 变量可用来收集通过 GET 和 POST 方法发送的表单数据。
- $_POST
- $_GET
- $_FILES
- $_ENV
- $_COOKIE
- $_SESSION
$GLOBALS
<?php
$x = 75;
$y = 25;
function addition()
{
$GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
}
addition();
echo $z;
?>
$_SERVER
<?php
echo $_SERVER['PHP_SELF'];
echo "<br>";
echo $_SERVER['SERVER_NAME'];
echo "<br>";
echo $_SERVER['HTTP_HOST'];
echo "<br>";
echo $_SERVER['HTTP_REFERER'];
echo "<br>";
echo $_SERVER['HTTP_USER_AGENT'];
echo "<br>";
echo $_SERVER['SCRIPT_NAME'];
?>
$_REQUEST
PHP $_REQUEST 用于收集HTML表单提交的数据。
<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>
<?php
$name = $_REQUEST['fname'];
echo $name;
?>
</body>
</html>
$_POST
在#表单一节中会详细讲解。
PHP $_POST 被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="post"。
<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>
<?php
$name = $_POST['fname'];
echo $name;
?>
</body>
</html>
$_GET
在#表单一节中会详细讲解。
PHP $_GET 同样被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="get"。
GET方法用&分隔传递的信息。
<html>
<body>
<a href="test_get.php?subject=PHP&web=runoob.com">Test $GET</a>
</body>
</html>
test_get.php
<html>
<body>
<?php
echo "Study " . $_GET['subject'] . " @ " . $_GET['web'];
?>
</body>
</html>
面向对象
- 类 − 定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。
- 对象 − 是类的实例。
- 成员变量 − 定义在类内部的变量。该变量的值对外是不可见的,但是可以通过成员函数访问,在类被实例化为对象后,该变量即可成为对象的属性。
- 成员函数 − 定义在类的内部,可用于访问对象的数据。
- 继承 − 继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。
- 父类 − 一个类被其他类继承,可将该类称为父类,或基类,或超类。
- 子类 − 一个类继承其他类称为子类,也可称为派生类。
- 多态 − 多态性是指相同的函数或方法可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。
- 重载 − 简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。
- 抽象性 − 抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。
- 封装 − 封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。
- 构造函数 − 主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
- 析构函数 − 析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做"清理善后" 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。
创建对象
$mercedes = new Car ();
$bmw = new Car ();
$audi = new Car ();
定义类
<?php
class phpClass {
var $var1;
var $var2 = "constant string";
function myfunc ($arg1, $arg2) {
[..]
}
[..]
}
?>
使用$this->var来指定类内变量。
<?php
class Site {
/* 成员变量 */
var $url;
var $title;
/* 成员函数 */
function setUrl($par){
$this->url = $par;
}
function getUrl(){
echo $this->url . PHP_EOL;
}
function setTitle($par){
$this->title = $par;
}
function getTitle(){
echo $this->title . PHP_EOL;
}
}
?>
表单
表单处理的完整内容(表单元素、GET/POST、验证、下拉菜单等)已移至 PHP 表单。
请求
请求行包含三个元素,需要用空格分隔:
- 方法
- 资源
- 客户端使用的协议版本
头部
读取:$_SERVER
写入:header() 必须在所有 HTML 之前写入!
查询字符串
格式:key1=value1&key2=value2
GET 和 POST
- GET
- 变量在 URL 中可见
- 大小限制(取决于操作系统)
- 表单中使用 method="get"
- POST
- 变量不在 URL 中可见
- 变量在 HTTP 请求的主体中发送(在头部之后)
- 没有大小限制(然而,默认情况下,POST 方法的发送信息的量最大值为 8 MB)
- method="post"
为了更好的性能,选择通过 GET 发送短字段 如果字段多或长,选择 POST 为了安全,使用 POST(数据不直接在 URL 中捕获)
重定向Redirection
HTTP 响应头:"Location:[url]" 在 PHP 中
header("Location:[url]")
Cookies
用于识别用户。cookie 是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,这台计算机将会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。
setcookie(name, value, [expiration_timestamp] ...):setcookie() 函数必须位于 <html> 标签之前。
<?php
setcookie("user", "runoob", time()+3600); //user 的cookie 值为runoob,一小时后过期
?>
<html>
.....
注释:在发送 cookie 时,cookie 的值会自动进行 URL 编码,在取回时进行自动解码。(为防止 URL 编码,请使用 setrawcookie() 取而代之。)
取回cookie
$_COOKIE["cookieName"]
<?php
// 输出 cookie 值
echo $_COOKIE["user"];
// 查看所有 cookie
print_r($_COOKIE);
?>
删除cookie
将其过期日期变更为过去的时间点。如:
<?php
// 设置 cookie 过期时间为过去 1 小时
setcookie("user", "", time()-3600);
?>
Session: En l'absence de requête de la part du client pendant 24 minutes (cf. php.ini : session.gc_maxlifetime), le serveur oublie l&39;identifiant de session du client
Cookie: Les cookies d'identification de session n&39;ont pas de date d'expiration, ils sont donc stockés dans l&39;environnement du navigateur et pas sur le disque dur du client
→Si le navigateur est fermé, le cookie disparaît, le client devra se reconnecter
Les cookies sont partagés entre toutes les fenêtres du navigateur ! Donc, Pour se connecter avec deux utilisateurs différents, utiliser deux navigateurs différents.
会话Session
session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置。Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的。
您在计算机上操作某个应用程序时,您打开它,做些更改,然后关闭它。这很像一次对话(Session)。
会话信息是临时的,在用户离开网站后将被删除。如果您需要永久存储信息,可以把数据存储在数据库中。
为每个访客创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,或者通过 URL 进行传导。
session_start()
必须在所有 HTML 之前写入!
<?php session_start(); ?>
<html>
<body>
</body>
</html>
存储
$_SESSION
<?php
session_start();
// 存储 session 数据
$_SESSION['views']=1;
?>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
<?php
// 检索 session 数据
echo "浏览量:". $_SESSION['views'];
?>
</body>
</html>
在下面的实例中,我们创建了一个简单的 page-view 计数器。isset() 函数检测是否已设置 "views" 变量。如果已设置 "views" 变量,我们累加计数器。如果 "views" 不存在,则创建 "views" 变量,并把它设置为 1:
<?php
session_start();
if(isset($_SESSION['views']))
{
$_SESSION['views']=$_SESSION['views']+1;
}
else
{
$_SESSION['views']=1;
}
echo "浏览量:". $_SESSION['views'];
?>
销毁session
unset() 函数用于释放指定的 session 变量:
<?php
session_start();
if(isset($_SESSION['views']))
{
unset($_SESSION['views']);
}
?>
session_destroy()彻底销毁 session。
<?php
session_destroy();
?>
PHP 8.x 新特性速览
以下为 PHP 8.0 至 8.5 中改变日常编码方式的关键特性:
Match 表达式(8.0)
$status = match($code) {
200 => 'OK',
301 => 'Moved',
404 => 'Not Found',
default => 'Unknown',
};
比 switch 更简洁,返回值可直接赋值,严格比较(===),无 fall-through。
Nullsafe Operator(8.0)
$country = $user?->address?->country ?? 'Unknown';
?-> 链式调用中任一环节为 null 则整体返回 null,替代繁琐的 isset 检查。
Enums(8.1)
enum Status: string {
case Pending = 'pending';
case Active = 'active';
case Closed = 'closed';
}
function setStatus(Status $s): void { ... }
setStatus(Status::Active);
枚举类型,支持 string/int backed enum,可定义方法和实现接口。
Readonly Properties(8.1)
class Point {
public function __construct(
public readonly float $x,
public readonly float $y,
) {}
}
readonly 属性初始化后不可修改,适合值对象(Value Object)和 DTO。
Fibers(8.1)
$fiber = new Fiber(function (): void {
$value = Fiber::suspend('fiber suspended');
echo "Received: $value";
});
$result = $fiber->start(); // 'fiber suspended'
$fiber->resume('hello'); // 'Received: hello'
轻量级协程原语,是 async/await 框架(如 Swoole、ReactPHP)的底层基础。
Property Hooks(8.4)
class User {
public string $fullName {
get => $this->firstName . ' ' . $this->lastName;
}
public string $firstName {
set => ucfirst(strtolower($value));
}
}
属性级别的 get/set 钩子,替代简单的 getter/setter 方法,支持虚拟属性。
Pipe Operator(8.5)
$title = ' PHP 8.5 Released ';
$slug = $title |> trim(...) |> strtolower(...) |> str_replace('.', '-', ...);
|> 操作符支持函数链式调用,从左到右传递值,告别嵌套调用地狱。
相关文章
- PHP 基础 — 入门速查
- PHP 面向对象 — 类、继承、接口、Trait
- PHP 8.x 新特性 — 8.0–8.5 新特性专题
- PHP 数据库 — PDO、MySQL、CRUD
- PHP 文件操作 — 文件读写、上传
- PHP 表单 — 表单处理与验证
- PHP 安全实践 — 密码、注入、XSS 防护