发布于 2026-01-06 0 阅读
0

另一份 PHP 8++ 速查表

另一份 PHP 8++ 速查表

需要了解的重要 PHP 概念

PHP(超文本预处理器)是一种功能强大的类 C 脚本语言,但由于其历史原因,有时会受到不良评价。

虽然大多数建设性批评者对 PHP 4 或 5 有一些看法,但 PHP 7 和 PHP 8 是全新的。

该语言现在具有强类型、语法糖和许多其他您会喜欢的特性,特别是如果您来自其他编程语言。

PHP 是一种解释型语言

与其他一些语言不同,PHP 并非独立运行。您的代码还需要第三方 Web 服务器(例如 Apache、Nginx)、编译器和 PHP 解释器才能正常工作。

解释器读取您的.php文件,解析它,执行它,然后将输出发送到网络服务器。

然后,服务器将输出通过 HTTP 响应发送给浏览器(客户端)。

PHP 扩展和可重用函数

PHP 可以使用大多数用 C 语言编写的扩展,但也有一些是直接用 PHP 编写的第三方库。

有些指令会随 PHP 二进制文件一起编译,有些指令是可选的,必须包含在php.ini编写 PHP 指令的文件中。

生命周期:Lexing

大部分 PHP 代码都会变成一系列标记(标记化),但特殊符号如?=、 或;已经标记化了。

词法分析器生成词素,词素是由数字和字母混合而成的,代表词法单元及其匹配值。

生命周期:解析/抽象语法树

解析器以词法分析器生成的标记流作为输入。

它应用语法规则来验证这些标记,并使用php-ast 扩展生成抽象树 (AST)

生命周期:编译/操作码

编译是使用抽象语法树(AST)的过程。它通过遍历抽象语法树生成操作码,并运行一些内部优化。

这些操作码并非无法阅读,但与原始源代码有很大不同,例如,中间操作的结果,如truefalse对于类似这样的条件$a === $b

生命周期:Opcache

启用 Opcache 可以缓存操作码,保存先前操作的结果,并优化指令以提高性能。

生命周期:解读

Zend Engine(虚拟机)以操作码作为输入,输出结果并执行指令。

生命周期:PHP 8 JIT 编译/操作缓存

即时编译与 Opcache(将预编译序列存储在内存中以绕过解析和解释)配合使用,可提高 CPU 密集型应用程序(例如机器学习、复杂的数学运算、3D 等)的性能。

JIT需要进行精细调整,并不适用于所有项目

作曲家

Composer是PHP的包管理器,它提供了一种智能的方式来管理和加载依赖项。

PHP 8 中的数据类型

整数

例如:1, 2, 3, 4, 5, 6, ..., n

布尔值

true或者false

字符串

诸如“粉红大象”之类的字符序列

双打

浮标,例如38.2

数组

例如,值的集合["a","b","c",]

对象

可以承载大量函数和值的 PHP 类实例。

资源

对外部资源的特殊引用,例如远程连接(例如数据库、云服务)。

无效的

特殊类型,唯一值为 NULL。

混合

任何事物!

可迭代的

数组或可遍历数组

常用转义字符

\n

线

\t

水平表格

\v

垂直表格

\r

回车

\e

逃脱

PHP基本语法

始终使用规范标签

开头和结尾标签:

<?php
// my_script.php
?>
Enter fullscreen mode Exit fullscreen mode

注释代码

<?php
// a comment using "//", you can also use "#"
/*
Handle multiple lines 
with '/' 
and '*'
*/
?>
Enter fullscreen mode Exit fullscreen mode

PHP 区分大小写。

$lower与 . 不是同一个变量$Lower

切勿省略分号。

与 CSS 或 JavaScript 不同,你不能省略;表达式和语句末尾的 `\n`:

<?php
echo 'test';
?>
Enter fullscreen mode Exit fullscreen mode

缩进仅用于提高可读性。

与 Python 不同,PHP 不关心缩进和空格。

简单引语

<?php
echo 'test';
?>
Enter fullscreen mode Exit fullscreen mode

双引号

双引号允许变量插值和使用转义字符:

<?php
$my_var = 'test';
echo "\t\t\t This is a $my_var \n";
?>
Enter fullscreen mode Exit fullscreen mode

预定义变量

预定义变量(也称为超全局变量)可用于处理特定情况:

$GLOBALS

引用全局作用域内的所有变量。

$_REQUEST

$_GET传递给、$_POST和 的关联变量数组$_COOKIE

$_POST

传递给当前脚本的关联变量数组,通常与表单(application/x-www-form-urlencodedmultipart/form-dataHTTP 内容类型)一起传递。

$_COOKIE

通过 HTTP Cookies 传递给当前脚本的关联变量数组。

$_GET

通过 URL 参数传递给当前脚本的变量关联数组。

$_SERVER

服务器和执行环境信息。

点击此处查看更多超级全球企业

魔法常数

__DIR__

当前文件所在的目录。

__FILE__

当前文件的完整路径。

__LINE__

文件中当前行的行号。

__CLASS__

当前类的名称,包括其命名空间。

__FUNCTION__

当前函数的名称。

__METHOD__

当前方法的名称。

__NAMESPACE__

当前命名空间的名称。

__TRAIT__

当前特征的名称。

循环,循环,循环

for

<?php
for ($i = 0; $i < 23; $i++) {
    echo $i;
}
?>
Enter fullscreen mode Exit fullscreen mode

foreach

<?php
$letters = ["a", "b", "c",]
foreach ($letters as $letter) {
    echo "$letter \n";
}
?>
Enter fullscreen mode Exit fullscreen mode

while

注意,如果条件语句格式错误,可能会导致无限循环:

<?php
$j = 1;
while($j <= 5) {
  echo "$j \n";
  $j++;
}
?>
Enter fullscreen mode Exit fullscreen mode

do while

当测试结果依赖于循环结果时,可以使用它:

<?php
$i = 0;
do {
    echo $i;
} while ($i > 0);
?>
Enter fullscreen mode Exit fullscreen mode

操作员

任务

按值赋值=

<?php
$a = 110;
$a += 1;
$b = "Hello ";
$b .= "World";
?>
Enter fullscreen mode Exit fullscreen mode

引用分配&

<?php
$a = 111;
$b = &$a; // $b and $a point to the same data, there's no copy
?>
Enter fullscreen mode Exit fullscreen mode

算术

+

添加

-

减法

*

乘法

/

分配

**

指数运算

%

模(除法的提示)

逻辑

AND

&&

OR

或者

||

或者

!

不是

xor

$a xor $b意味着$a二者之一,$b但不能两者兼具。

比较

===

完全相同的

!==

不完全相同

<>

不等于

<

低于

>

大于

<=

低于或等于

>=

等于或大于

<=>

低于、等于或高于

不寻常的或鲜为人知的

|

或者,但包括

^

异或

~

不是

...

扩展运算符用于合并元素

<?php
$arr = [1, 2, 3];
$arr2 = [...$arr, 4, 5, 6];
?>
Enter fullscreen mode Exit fullscreen mode

_

<?php
$price = 1_1_1;
echo $price; // 111
?>
Enter fullscreen mode Exit fullscreen mode

状况

经典条件

<?php
if (CONDITION1) {
} elseif (CONDITION2) {
} else {
}
?>
Enter fullscreen mode Exit fullscreen mode

切换情况

<?php
switch ($n) {
    case 1:
        $r = "You are alone";
        break;
    case 2:
        $r = "It's a double situation.";
        break;
    case 3:
        $r = "It's the third case.";
        break;
    default:
        $r = "I don't know.";
}
echo $r;
?>
Enter fullscreen mode Exit fullscreen mode

空值合并运算符(PHP 7 起)

<?php
$search = $_GET['search'] ?? 'does not exist or is null';
?>
Enter fullscreen mode Exit fullscreen mode

匹配表达式(@since PHP 8)

<?php
echo match ($n) {
  1 => "You are alone",
  2 => "It's a double situation.",
  3 => "It's the third case.",
  default => "I don't know.",
};?>
Enter fullscreen mode Exit fullscreen mode

三元条件

<?php
$a = (expression1) ? expression2 : expression3;
?>
Enter fullscreen mode Exit fullscreen mode

猫王状态(或操作员)

<?php
$a = (expression1) ?: expression2; // I never use it, but it exists...
// the same as $a = (expression1) ? expression1 : expression2;
?>
Enter fullscreen mode Exit fullscreen mode

瞄准镜

全局、局部和静态:

<?php
function test() {
    $b = "b"; // local
    global $c;
    $c = "c"; // global
    static $d = 0;
    $d++;// $d increment on each function call
}
?>
Enter fullscreen mode Exit fullscreen mode

日期和时间格式

D

工作日:周一至周日

d

第 1 天至第 31 天

j

第1天至第31天

L

闰年或非闰年(1 或 0)

周日至周六

N

第1天(周一)至第7天(周六)

西

第0天(周日)至第6天(周六)

M

月份:1月至12月

1至12个月

n

1至12个月

F

月份:一月至十二月

年份四位数(例如,2022)

年份两位数(例如,22)

一个

上午和下午

一个

上午和下午

G

0至23小时

第1至12小时

H

00 至 23 小时

h

上午 1 点至下午 12 点

00分钟至59分钟

s

秒 00 至 59

请参阅文档以获取完整列表。

过滤器

过滤器标志和常量对于验证或清理输入内容尤其有用。例如,与其使用牵强的正则表达式来过滤电子邮件,不如这样做:

$email = "elon.musk@tesla.com";
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
    // process
}
Enter fullscreen mode Exit fullscreen mode

查看所有筛选条件

高级 PHP 语法

NowdocHeredoc语法可以非常方便地处理多行数据。

Heredoc

<?php
echo <<<EOT
Hello, this is a test
Thank you for your time
EOT;
?>
Enter fullscreen mode Exit fullscreen mode

现在医生

<?php
$my_var = 'test';
echo <<<EOT
Hello, this is a $my_var
Thank you for your time
EOT;
?>
Enter fullscreen mode Exit fullscreen mode

使用数组

数组并非 PHP 特有的概念,但 PHP 开发人员经常会用到它们。

如果你想学习这门语言,就不能跳过这一步。

使用发电机

文件入门

将文件读取为字符串

<?php
echo file_get_contents($file);
?>
Enter fullscreen mode Exit fullscreen mode

在文件中书写

<?php
$file = 'file.txt';
$text = "Test write\n";
file_put_contents($file, $text, FILE_APPEND | LOCK_EX);
?>
Enter fullscreen mode Exit fullscreen mode

删除文件

unlink($file);

处理 CSV 文件

来源

<?php
$row = 1;
if (($handle = fopen("test.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $num = count($data);
        echo "<p> $num fields in line $row: <br /></p>\n";
        $row++;
        for ($c=0; $c < $num; $c++) {
            echo $data[$c] . "<br />\n";
        }
    }
    fclose($handle);
}
?>
Enter fullscreen mode Exit fullscreen mode

表单入门

表单可能是黑客攻击的主要目标,尤其是在基于 PHP 的网站上,因为它们通常与其他实例(例如 SQL 数据库)相连。

设有各种付费墙的网站是主要目标。

在 PHP 中,数据通常会根据 URL(GET 请求)或 HTTP POST 请求而变化。例如,搜索表单通常会使用 URL 参数,而登录表单则会发送 POST 请求。

因此,表单处理可能涉及全局变量$_GET$_POST以便捕获输入值。
请参阅此指南。

数据库入门

您很可能会将数据库与 PHP 结合使用。无论使用何种数据库管理系统,您都需要使用正确的 PHP 工具才能从 PHP 脚本连接数据库并与之交互。

否则,您的应用程序可能容易受到 SQL 注入攻击。

PDO入门

<?php
try {
    $pdo = new PDO("mysql:host=localhost;dbname=db_username;charset=utf8mb4", "db_username", "db_password");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    if ($pdo) {
        $statement = $pdo->query("SELECT some_field FROM some_table");
        $row = $statement->fetch(PDO::FETCH_ASSOC);
        echo htmlentities($row['some_field']);
    }
} catch(\PDOException $e) {
   throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
?>
Enter fullscreen mode Exit fullscreen mode

使用 PDO 确保输入安全

PDO 非常便于对输入进行转义和清理:

<?php
$q = $pdo->prepare('SELECT name FROM users WHERE id = :id');
$id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT);
$q->bindParam(':id', $id, PDO::PARAM_INT);
$q->execute();
?>
Enter fullscreen mode Exit fullscreen mode

来源:PHP 正确之道 - PDO

PHP CLI

您可以通过多种方式从终端运行 PHP:

执行.php文件

php my_script.php
Enter fullscreen mode Exit fullscreen mode

启动交互式 shell

php -a
Interactive shell
php > echo "hi";
hi
php > 
Enter fullscreen mode Exit fullscreen mode

将指令作为参数传递

php -r 'echo "hi";'
Enter fullscreen mode Exit fullscreen mode

您可以编写旨在从终端使用的 PHP 脚本:

向 PHP 脚本传递参数

php my_script.php "test"
Enter fullscreen mode Exit fullscreen mode
<?php
// my_script.php
print_r($argv[1]);// test
?>
Enter fullscreen mode Exit fullscreen mode

启动本地服务器

php -S localhost:1001

PHP 8 新增功能

公平地说,PHP 7.4 开启了类型化属性等重大变革,但 PHP 8 将 PHP 推向了新的高度。

不过,如果您必须从旧版本迁移,请务必小心,因为新版本比以前严格得多。PHP 8 会故意抛出更多致命错误,以降低容错率。静默运算符@已不再存在,默认的错误报告级别为E_ALL!

以下是我喜欢的一些很棒的新功能,详情请参阅发布公告:

命名参数

允许省略可选参数,并且在使用函数时比位置参数更易读:

<?php
function say_hello(string $message = 'Hi', string $name) {
    echo "$message $name";
}
say_hello(name: "Zed");
?>
Enter fullscreen mode Exit fullscreen mode

空安全运算符

可以删除大量不必要的冗长if/else条件:

<?php
return $user->getJob()?->getSalary()?->bitcoins;
?>
Enter fullscreen mode Exit fullscreen mode

联合类型

允许在转换参数时使用多种类型:

<?php
function convert(int|float $value): int|float {}
?>
Enter fullscreen mode Exit fullscreen mode

建筑商房地产推广

允许在传递参数时跳过 PHP 类中大量的冗长初始化代码:

<?php
class Character {
    public function __construct(private string $name) {}
}
?>
Enter fullscreen mode Exit fullscreen mode

0 == 'ki' // false

这种情况true在 PHP 8 之前出现,PHP 8 的规则较为宽松。

JIT编译器

请参阅第一部分:重要的 PHP 概念

str_contains()

<?php
if (str_contains($string, 'target')) {
    // code
}
?>
Enter fullscreen mode Exit fullscreen mode

PHP 8.1 新增功能

以下是我喜欢的一些很棒的新功能,详情请参阅发布公告:

枚举

枚举是一种特殊的对象,它由一个自定义类型组成,该类型仅限于一个或离散数量的可能值

<?php
enum Colors
{
    case Red;
    case Blue;
    case Green;
}
?>
Enter fullscreen mode Exit fullscreen mode

支持对字符串键数组进行数组解包

您可以使用扩展运算符处理字符串键数组(PHP 7 和 8 中仅支持数字键数组):

<?php
$arr1 = ['a' => 1];
$arr2 = ['b' => 2];
$results = ['a' => 0, ...$arr1, ...$arr2];
print_r($results);
?>
Enter fullscreen mode Exit fullscreen mode

永远不要返回类型

Never 返回类型允许指定函数不会返回任何值,并且很可能会终止或退出:

<?php
function redirect_uri(string $uri): never {
    header('Location: ' . $uri);
    exit();
}
?>
Enter fullscreen mode Exit fullscreen mode

纯交集类型(&

纯交集类型是强制执行多个约束的绝佳方法:

<?php
function count_and_iterate(Iterator&Countable $value) {
    foreach ($value as $val) {
        echo $val;
    }
    count($value);
}
?>
Enter fullscreen mode Exit fullscreen mode

捕获 PHP 8 中的错误

在 PHP 8 中,您无需捕获异常,例如:

class CustomException extends \Exception {}
try {
    // code
 } catch (CustomException) { // instead of catch (CustomException $exception)
    Log::error("Error");// Log is a custom class too (not native)
}
Enter fullscreen mode Exit fullscreen mode

需要注意的是,PHP 现在频繁抛出异常:

现在,如果参数验证失败,大多数内部函数都会抛出错误异常。

杂项

解构

<?php
$array = ['first', 'second', 'third',];
[, , $c] = $array;
// $c = 'third'
?>
Enter fullscreen mode Exit fullscreen mode

箭头函数

<?php
$y = 111;
$f = fn($x) => $x + $y;
echo $f(222);// 333
?>
Enter fullscreen mode Exit fullscreen mode

抛掷表情

<?php
$err = fn () => throw new CustomErrors();
?>
Enter fullscreen mode Exit fullscreen mode

::class

迷人的:

<?php
$my_class = new MyClass();
var_dump($my_class::class);// instead of using get_class()
?>
Enter fullscreen mode Exit fullscreen mode

函数或类定义中的尾随逗号

<?php
public static function(
    string $name,
    int $number,
) {
    // code
}
?>
Enter fullscreen mode Exit fullscreen mode

PSR

PSR是 PHP 代码编写标准。您可能已经见过PSR-0PSR 或 PSRPSR-4版本,尤其是在通过 Composer 自动加载依赖项时。这些是 PHP 标准的特定版本。

面向对象编程

面向对象编程既有趣又强大,但精通却很难。好消息是,大多数编程语言都支持面向对象编程,所以学习它绝对是一项不错的投资。

有些开发者认为这是开发软件的唯一正确方法,有些则坚持使用过程式代码。无论如何,你都不能跳过这一步。

学习设计模式

缓存

我最喜欢的 PHP 缓存解决方案

调试和性能分析

console.log PHP 数据

<?php
function console_log( $data ){
  echo '<script>';
  echo 'console.log('. json_encode( $data ) .')';
  echo '</script>';
}
?>
Enter fullscreen mode Exit fullscreen mode

xdebug

xdebug

助手

  • print_r()接受一个参数
  • var_dump()接受多个参数
  • var_dump(debug_backtrace())生成回溯信息
  • debug_print_backtrace():打印回溯信息

分析器

应用程序可能需要性能分析工具来防止内存泄漏和其他性能问题:

测试、测试、测试

专业人员会运行单元测试、集成测试、验收测试以及许多其他类型的测试,以防止出现严重的回归问题:PHPUnit

处理 HTTP 请求

有很多方法,但我更喜欢使用http-client 包composer require symfony/http-client

这是一个底层HTTP客户端,同时支持PHP流封装器和cURL。您可以同步或异步地获取数据。

请参阅http-client 速查表

文章来源:https://dev.to/spo0q/another-php-8-cheat-sheet-58kn