ESC
输入关键词搜索文章
目录

PHP

PHP(PHP: Hypertext Preprocessor)可以直接嵌入到 HTML 页面的源代码中,使用 <?php?> 标签。截至 2026 年,PHP 8.5 是最新稳定版本,带来了 URI Extension、Pipe Operator、Clone With 等新特性。本页涵盖 PHP 核心语法,同时标注了 8.0–8.5 引入的重要变化。

参考

PHP 版本速览

版本发布关键特性
8.02020-11JIT 编译、Named Arguments、Union Types、Match Expression、Nullsafe Operator
8.12021-11Enums、Fibers、Readonly Properties、Intersection Types
8.22022-12Readonly Classes、DNF Types、Dynamic Properties 废弃
8.32023-11Typed Constants、#[\Override]、json_validate()
8.42024-11Property Hooks、Asymmetric Visibility、Lazy Objects
8.52025-11URI 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 中移除。请使用 PDOmysqli_*

字符

双引号字符串会将转义序列 \r\n 分别解释为 '0x0D''0x0A'

"\r\n"

单引号字符串只认识转义序列 \\\'

Echo与Print

echo 和 print 区别:

同:

变量

PHP是一门弱类型语言。

PHP 有四种不同的变量作用域:

函数内部声明的是局部变量,仅能在函数内部使用,函数外部声明的变量则有全局作用域。

作用域

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 

数据类型

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

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

对象与类

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 ] )

<?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)

递增递减运算符

比较运算符

逻辑运算符

支持类C++与类python两套逻辑运算符。

数组运算符

三元运算符?:

判断 $_GET 请求中含有 user 值,如果有返回 $_GET[&#39;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

函数

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")

排序

常用函数


<?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);

默认值

使用=指定

魔术常量

值随其在代码中的位置而变化。

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

<?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>

面向对象

创建对象

$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 发送短字段 如果字段多或长,选择 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&#39;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&#39;identification de session n&39;ont pas de date d&#39;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('.', '-', ...);

|> 操作符支持函数链式调用,从左到右传递值,告别嵌套调用地狱。

相关文章