首页 > 代码库 > 心心念念的单位之一,感谢🐱
心心念念的单位之一,感谢🐱
不知结局如何,5月10日。愿我好运
1. ------------------------------------------php7新特性
a. 运算符(NULL 合并运算符)
把这个放在第一个说是因为我觉得它很有用。用法:
$a = $_GET[‘a‘] ?? 1;
它相当于:
<php
$a = isset($_GET[‘a‘]) ? $_GET[‘a‘] : 1;
我们知道三元运算符是可以这样用的:
$a ?: 1
但是这是建立在 $a 已经定义了的前提上。新增的 ?? 运算符可以简化判断。
b. 函数返回值类型声明
这个特性可以帮助我们避免一些 PHP 的隐式类型转换带来的问题。在定义一个函数之前就想好预期的结果可以避免一些不必要的错误。
不过这里也有一个特点需要注意。PHP 7 增加了一个 declare 指令:strict_types,既使用严格模式。
使用返回值类型声明时,如果没有声明为严格模式,如果返回值不是预期的类型,PHP 还是会对其进行强制类型转换。但是如果是严格模式, 则会出发一个 TypeError 的 Fatal error。
强制模式:
<php
function foo($a) : int
{
return $a;
}
foo(1.0);
以上代码可以正常执行,foo 函数返回 int 1,没有任何错误。
严格模式:
<php
declare(strict_types=1);
function foo($a) : int
{
return $a;
}
foo(1.0);
# PHP Fatal error: Uncaught TypeError: Return value of foo() must be of the type integer, float returned in test.php:6
在声明之后,就会触发致命错误。
是不是有点类似与 js 的 strict mode?
c. void函数
在PHP 7 中引入的其他返回值类型的基础上,一个新的返回值类型void被引入。 返回值声明为 void 类型的方法要么干脆省去 return 语句,要么使用一个空的 return 语句。 对于 void 函数来说,null 不是一个合法的返回值。
function swap(&$left, &$right) : void
{
if ($left === $right) {
return;
}
$tmp = $left;
$left = $right;
$right = $tmp;
}
$a = 1;
$b = 2;
var_dump(swap($a, $b), $a, $b);
以上例程会输出:
null
int(2)
int(1)
试图去获取一个 void 方法的返回值会得到 null ,并且不会产生任何警告。这么做的原因是不想影响更高层次的方法。
c. 为unserialize()提供过滤
这个特性旨在提供更安全的方式解包不可靠的数据。它通过白名单的方式来防止潜在的代码注入。
//将所有对象分为__PHP_Incomplete_Class对象
$data = http://www.mamicode.com/unserialize($foo, ["allowed_classes" => false]);
//将所有对象分为__PHP_Incomplete_Class 对象 除了ClassName1和ClassName2
$data = http://www.mamicode.com/unserialize($foo, ["allowed_classes" => ["ClassName1", "ClassName2"]);
//默认行为,和 unserialize($foo)相同
$data = http://www.mamicode.com/unserialize($foo, ["allowed_classes" => true]);
d. 命名空间的导入(group use declarations)
从同一 namespace 导入的类、函数和常量现在可以通过单个 use 语句 一次性导入了。
//PHP7之前
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;
use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;
use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;
// PHP7之后
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};
e. 通过define()定义常量数组
define(‘ANIMALS‘, [‘dog‘, ‘cat‘, ‘bird‘]);
echo ANIMALS[1]; // outputs "cat"
f. ini文件中 #注释格式被移除
在配置文件INI文件中,不再支持以 # 开始的注释行, 请使用 ;(分号)来表示注释。 此变更适用于 php.ini 以及用 parse_ini_file() 和 parse_ini_string() 函数来处理的文件。
2. ------------------------------------------mysql新加入的json特性
- insert into vince.test(`data`) values(‘{"name":"tomcat","age":15}‘);
- UPDATE `vince`.`test` SET `data` = ‘{"name":"vincent","age":14}‘ WHERE `id` = 1;
- select JSON_EXTRACT(data,‘$.name‘),JSON_EXTRACT(data,‘$.age‘) from vince.test;
-
可以看出JSON被解析拆分,但对于字符串会保留双引号,这种是利用函数方法进行JSON提取的,还可以利用虚列virtual
- #将JSON中的某一属性设置为虚列
- alter table vince.test add test_name varchar(128) generated always as (JSON_EXTRACT(data,‘$.name‘)) virtual;
- select test_name from vince.test;
- #根据虚列查询
- explain select * from vince.test where test_name=‘vince‘;
- select * from vince.test where test_name=‘"vincent"‘;
通过执行计划可以看出是否走索引和where条件,对于虚列还可以增加索引,就像普通的列一样,不过更新时不需要对虚列再进行更新,直接更新JSON的内容后,虚列会同步更新,因为虚列其实就是个引用,不会冗余存储
以前总是喜欢做成之后,再公布;你说只是约面而已,我是开心的不得了。。。
心心念念的单位之一,感谢🐱