## 1.JIT编译原理
1.1 JIT编译原理图
1.2 Zend Opcache作用
1.3 JIT编译原理
1.3 Opcache示意图的关键点
#php.ini
zend_extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20200930/opcache.so
opcache.enable=1
opcache.enable_cli=1
#php.ini
opcache.jit = 1205
opcache.jit_buffer_size = 64M
源代码(人认识)->字节码(解释器认识)->机器码(硬件认识)
1.来看下PHP的执行流程,假设有个a.php文件,不启用opacache的流程如下:
a.php->经过zend编译->opcode->PHP解释器->机器码
启用opacache的流程如下
a.php->查找opacache缓存,如果没有则进行zend编译为opcode并缓存->opacode->PHP解释器->机器码
2.启用jit的流程如下
a.php->编译->机器码
以后都只执行机器码,不编译,效率上高了很多
function test($name, $age='18', $sex='男') {
echo $name . '-------' . $age . '--------'. $sex;
}
test('Landy', 20, '女'); //Landy-------20--------女
function test($name, $age='18', $sex='男') {
echo $name . '-------' . $age . '--------'. $sex;
}
test('Landy', age: 20, sex: '女'); //Landy-------20--------女
---可以跳过参数
test('Landy', sex: '女'); //Landy-------20--------女
---参数的顺序可以不固定
test(age: 30, sex: '女', name: 'tom'); //tom-------30--------女
-------------------还可以这样
function test1($arg1,$arg2, ...$args) {
print_r($args);
}
test1(1,2, name:'Landy', age:11, sex:2);
Array
(
[name] => Landy
[age] => 11
[sex] => 2
)
switch (8.0) {
case '8.0':
$result = "Oh no!";
break;
case 8.0:
$result = "This is what I expected";
break;
}
echo $result;
//> Oh no!
echo match (8.0) {
'8.0' => "Oh no!",
8.0 => "This is what I expected",
};
//> This is what I expected
1.match 为表达式,意味着其结果可以存储在变量中或用于返回。
2.match 分支仅支持单行表达式,同时不需要 break; 语句。
3.match 使用严格比较。
//可以和表达式匹配
function test3() {
return 8.0;
}
$a = 8.0;
$result = match($a) {
test3() => '匹配函数',
8.0 => '匹配8.0',
'8.0' => 'test 8.0',
9,10,11 => '多次匹配', //多次匹配
default => '没有匹配值'
}; //匹配函数
echo $result
$input = "false";
$result = match($input) {
"true" => 1,
};
//当input并不能被match中的所有条件满足的时候,match会抛出一个UnhandledMatchError exception:
class Point {
public float $x;
public float $y;
public float $z;
public function __construct(
float $x = 0.0,
float $y = 0.0,
float $z = 0.0
) {
$this->x = $x;
$this->y = $y;
$this->z = $z;
}
}
class Point {
public function __construct(
public float $x = 1.0,
public float $y = 2.0,
public float $z = 3.0,
) {}
}
echo (new Point())->x; // 1