首页 > 代码库 > 心心念念的单位之一,感谢🐱

心心念念的单位之一,感谢🐱

不知结局如何,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特性

技术分享

  1. insert into vince.test(`data`) values(‘{"name":"tomcat","age":15}‘);
  2. UPDATE `vince`.`test` SET `data` = ‘{"name":"vincent","age":14}‘ WHERE `id` = 1;  
  3. select JSON_EXTRACT(data,‘$.name‘),JSON_EXTRACT(data,‘$.age‘) from vince.test; 
  4. 可以看出JSON被解析拆分,但对于字符串会保留双引号,这种是利用函数方法进行JSON提取的,还可以利用虚列virtual

     
    1. #将JSON中的某一属性设置为虚列  
    2. alter table vince.test add test_name varchar(128) generated always as (JSON_EXTRACT(data,‘$.name‘)) virtual;  
              有了虚列后就可以直接用虚列作为条件查询
     
    1. select test_name from vince.test;    
    2. #根据虚列查询  
    3. explain select * from vince.test where test_name=‘vince‘;    
    4. select * from vince.test where test_name=‘"vincent"‘;  

           通过执行计划可以看出是否走索引和where条件,对于虚列还可以增加索引,就像普通的列一样,不过更新时不需要对虚列再进行更新,直接更新JSON的内容后,虚列会同步更新,因为虚列其实就是个引用,不会冗余存储

 

 

 

 

 

 

 

 

以前总是喜欢做成之后,再公布;你说只是约面而已,我是开心的不得了。。。

心心念念的单位之一,感谢🐱