另一份 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)的过程。它通过遍历抽象语法树生成操作码,并运行一些内部优化。
这些操作码并非无法阅读,但与原始源代码有很大不同,例如,中间操作的结果,如true或false对于类似这样的条件$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
?>
注释代码
<?php
// a comment using "//", you can also use "#"
/*
Handle multiple lines
with '/'
and '*'
*/
?>
PHP 区分大小写。
$lower与 . 不是同一个变量$Lower。
切勿省略分号。
与 CSS 或 JavaScript 不同,你不能省略;表达式和语句末尾的 `\n`:
<?php
echo 'test';
?>
缩进仅用于提高可读性。
与 Python 不同,PHP 不关心缩进和空格。
简单引语
<?php
echo 'test';
?>
双引号
双引号允许变量插值和使用转义字符:
<?php
$my_var = 'test';
echo "\t\t\t This is a $my_var \n";
?>
预定义变量
预定义变量(也称为超全局变量)可用于处理特定情况:
$GLOBALS
引用全局作用域内的所有变量。
$_REQUEST
$_GET传递给、$_POST和 的关联变量数组$_COOKIE。
$_POST
传递给当前脚本的关联变量数组,通常与表单(application/x-www-form-urlencoded或multipart/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;
}
?>
foreach
<?php
$letters = ["a", "b", "c",]
foreach ($letters as $letter) {
echo "$letter \n";
}
?>
while
注意,如果条件语句格式错误,可能会导致无限循环:
<?php
$j = 1;
while($j <= 5) {
echo "$j \n";
$j++;
}
?>
do while
当测试结果依赖于循环结果时,可以使用它:
<?php
$i = 0;
do {
echo $i;
} while ($i > 0);
?>
操作员
任务
按值赋值=
<?php
$a = 110;
$a += 1;
$b = "Hello ";
$b .= "World";
?>
引用分配&
<?php
$a = 111;
$b = &$a; // $b and $a point to the same data, there's no copy
?>
算术
+
添加
-
减法
*
乘法
/
分配
**
指数运算
%
模(除法的提示)
逻辑
AND
和
&&
和
OR
或者
||
或者
!
不是
xor
$a xor $b意味着$a二者之一,$b但不能两者兼具。
比较
===
完全相同的
!==
不完全相同
<>
不等于
<
低于
>
大于
<=
低于或等于
>=
等于或大于
<=>
低于、等于或高于
不寻常的或鲜为人知的
|
或者,但包括
^
异或
~
不是
...
扩展运算符用于合并元素
<?php
$arr = [1, 2, 3];
$arr2 = [...$arr, 4, 5, 6];
?>
_
<?php
$price = 1_1_1;
echo $price; // 111
?>
状况
经典条件
<?php
if (CONDITION1) {
} elseif (CONDITION2) {
} else {
}
?>
切换情况
<?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;
?>
空值合并运算符(自PHP 7 起)
<?php
$search = $_GET['search'] ?? 'does not exist or is null';
?>
匹配表达式(@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.",
};?>
三元条件
<?php
$a = (expression1) ? expression2 : expression3;
?>
猫王状态(或操作员)
<?php
$a = (expression1) ?: expression2; // I never use it, but it exists...
// the same as $a = (expression1) ? expression1 : expression2;
?>
瞄准镜
全局、局部和静态:
<?php
function test() {
$b = "b"; // local
global $c;
$c = "c"; // global
static $d = 0;
$d++;// $d increment on each function call
}
?>
日期和时间格式
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
}
查看所有筛选条件。
高级 PHP 语法
Nowdoc和Heredoc语法可以非常方便地处理多行数据。
Heredoc
<?php
echo <<<EOT
Hello, this is a test
Thank you for your time
EOT;
?>
现在医生
<?php
$my_var = 'test';
echo <<<EOT
Hello, this is a $my_var
Thank you for your time
EOT;
?>
使用数组
数组并非 PHP 特有的概念,但 PHP 开发人员经常会用到它们。
如果你想学习这门语言,就不能跳过这一步。
使用发电机
文件入门
将文件读取为字符串
<?php
echo file_get_contents($file);
?>
在文件中书写
<?php
$file = 'file.txt';
$text = "Test write\n";
file_put_contents($file, $text, FILE_APPEND | LOCK_EX);
?>
删除文件
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);
}
?>
表单入门
表单可能是黑客攻击的主要目标,尤其是在基于 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());
}
?>
使用 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();
?>
PHP CLI
您可以通过多种方式从终端运行 PHP:
执行.php文件
php my_script.php
启动交互式 shell
php -a
Interactive shell
php > echo "hi";
hi
php >
将指令作为参数传递
php -r 'echo "hi";'
您可以编写旨在从终端使用的 PHP 脚本:
向 PHP 脚本传递参数
php my_script.php "test"
<?php
// my_script.php
print_r($argv[1]);// test
?>
启动本地服务器
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");
?>
空安全运算符
可以删除大量不必要的冗长if/else条件:
<?php
return $user->getJob()?->getSalary()?->bitcoins;
?>
联合类型
允许在转换参数时使用多种类型:
<?php
function convert(int|float $value): int|float {}
?>
建筑商房地产推广
允许在传递参数时跳过 PHP 类中大量的冗长初始化代码:
<?php
class Character {
public function __construct(private string $name) {}
}
?>
0 == 'ki' // false
这种情况true在 PHP 8 之前出现,PHP 8 的规则较为宽松。
JIT编译器
请参阅第一部分:重要的 PHP 概念
str_contains()
<?php
if (str_contains($string, 'target')) {
// code
}
?>
PHP 8.1 新增功能
以下是我喜欢的一些很棒的新功能,详情请参阅发布公告:
枚举
枚举是一种特殊的对象,它由一个自定义类型组成,该类型仅限于一个或离散数量的可能值:
<?php
enum Colors
{
case Red;
case Blue;
case Green;
}
?>
支持对字符串键数组进行数组解包
您可以使用扩展运算符处理字符串键数组(PHP 7 和 8 中仅支持数字键数组):
<?php
$arr1 = ['a' => 1];
$arr2 = ['b' => 2];
$results = ['a' => 0, ...$arr1, ...$arr2];
print_r($results);
?>
永远不要返回类型
Never 返回类型允许指定函数不会返回任何值,并且很可能会终止或退出:
<?php
function redirect_uri(string $uri): never {
header('Location: ' . $uri);
exit();
}
?>
纯交集类型(&)
纯交集类型是强制执行多个约束的绝佳方法:
<?php
function count_and_iterate(Iterator&Countable $value) {
foreach ($value as $val) {
echo $val;
}
count($value);
}
?>
捕获 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)
}
需要注意的是,PHP 现在频繁抛出异常:
现在,如果参数验证失败,大多数内部函数都会抛出错误异常。
杂项
解构
<?php
$array = ['first', 'second', 'third',];
[, , $c] = $array;
// $c = 'third'
?>
箭头函数
<?php
$y = 111;
$f = fn($x) => $x + $y;
echo $f(222);// 333
?>
抛掷表情
<?php
$err = fn () => throw new CustomErrors();
?>
::class
迷人的:
<?php
$my_class = new MyClass();
var_dump($my_class::class);// instead of using get_class()
?>
函数或类定义中的尾随逗号
<?php
public static function(
string $name,
int $number,
) {
// code
}
?>
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>';
}
?>
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