1. 程式人生 > >心心念念的單位之一,感謝🐱

心心念念的單位之一,感謝🐱

結果 -1 key 處理 integer 普通 ont 聲明 函數返回

不知結局如何,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 = unserialize($foo, ["allowed_classes" => false]);
//將所有對象分為__PHP_Incomplete_Class 對象 除了ClassName1和ClassName2
$data = unserialize($foo, ["allowed_classes" => ["ClassName1", "ClassName2"]);
//默認行為,和 unserialize($foo)相同
$data = 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的內容後,虛列會同步更新,因為虛列其實就是個引用,不會冗余存儲

以前總是喜歡做成之後,再公布;你說只是約面而已,我是開心的不得了。。。

心心念念的單位之一,感謝🐱