首頁  >  文章  >  後端開發  >  PHP7.0和php7.1中的語法新功能的總結

PHP7.0和php7.1中的語法新功能的總結

不言
不言原創
2018-08-07 11:15:192892瀏覽

這篇文章帶給大家的內容是關於PHP7.0和php7.1中的文法新特性的總結,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

php7.0的新特性:

#1、空合併運算子( ??)

簡化判斷

$param = $_GET['param'] ?? 1;

等於:

$param = isset($_GET['param']) ? $_GET['param'] : 1;

2、變數型別宣告

兩種模式: 強制( 預設) 和嚴格模式 
類型:string、int、float和bool

function add(int $a) { 
    return 1+$a; 
} 
var_dump(add(2);

3、傳回值類型宣告

函數和匿名函數都可以指定傳回值的類型

function show(): array { 
    return [1,2,3,4]; 
}

function arraysSum(array ...$arrays): array {
return array_map(function(array $array): int {
return array_sum($array);
}, $arrays);
}

4、太空船運算子(組合比較子)

##太空船運算子用於比較兩個表達式。當  a大於、等於或小於  b 時它分別回傳 -1 、 0 或 1 。比較的原則是沿用 PHP 的常規比較規則進行的。

// Integers
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
// Floats
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
// Strings
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1

5、匿名類別

現在支援透過new class 來實例化一個匿名類,這可以用來取代一些「用後即焚」的完整類定義。

interface Logger {
    public function log(string $msg);
}

class Application {
    private $logger;

    public function getLogger(): Logger {
        return $this->logger;
    }

    public function setLogger(Logger $logger) {
        $this->logger = $logger;
    }
}

$app = new Application;
$app->setLogger(new class implements Logger {
    public function log(string $msg) {
        echo $msg;
    }
});
var_dump($app->getLogger());

6、Unicode codepoint 轉譯語法

這接受一個以16進位形式的Unicode codepoint,並印出一個雙引號或heredoc包圍的UTF-8編碼格式的字串。可以接受任何有效的 codepoint,並且開頭的 0 是可以省略的。

 echo "\u{9876}"

舊版輸出:\u{9876} 

新版輸入:頂

7、Closure::call()

#Closure: :call() 現在有著更好的效能,簡短幹練的暫時綁定一個方法到物件上閉包並呼叫它。

class Test {
    public $name = "lixuan";
}

//PHP7和PHP5.6都可以
$getNameFunc = function () {
    return $this->name;
};
$name = $getNameFunc->bindTo(new Test, &#39;Test&#39;);
echo $name();
//PHP7可以,PHP5.6报错
$getX = function () {
    return $this->name;
};
echo $getX->call(new Test);

8、為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]);

9、IntlChar

新增加的 IntlChar 類別旨在暴露出更多的 ICU 功能。這個類別本身定義了許多靜態方法用於操作多字元集的 unicode 字元。 Intl是Pecl擴展,使用前需編譯進PHP中,也可apt-get/yum/port install php5-intl

printf(&#39;%x&#39;, IntlChar::CODEPOINT_MAX);
echo IntlChar::charName(&#39;@&#39;);
var_dump(IntlChar::ispunct(&#39;!&#39;));

以上例程會輸出: 

10ffff 
COMMERCIAL AT 
#bool(true)

10、預期

預期是向後兼用並增強先前的assert() 的方法。它使得在生產環境中啟用斷言為零成本,並且提供當斷言失敗時拋出特定異常的能力。舊版的API出於相容目的將繼續被維護,assert()現在是一個語言結構,它允許第一個參數是一個表達式,而不僅僅是一個待計算的 string或一個待測試的boolean。

ini_set(&#39;assert.exception&#39;, 1);
class CustomError extends AssertionError {}
assert(false, new CustomError(&#39;Some error message&#39;));

以上例程會輸出: 

Fatal error: Uncaught CustomError: Some error message

11、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};

12、intp()

接收兩個參數作為被除數和除數,傳回他們相除結果的整數部分。

var_dump(intp(7, 2));

輸出int(3)

13、CSPRNG

新增兩個函數: random_bytes() and random_int().可以加密的生產被保護的整數和字串。總之隨機數字變安全了。

random_bytes — 加密生存被保護的偽隨機字串 
random_int —加密生存被保護的偽隨機整數

14、preg_replace_callback_array()

新增了一個函數preg_replace_callback_array(),使用該函數可以使得在使用preg_replace_callback()函數時程式碼變得更加優雅。在PHP7之前,回呼函數會呼叫每一個正規表示式,回呼函數在部分分支上是被污染了。

15、Session options

現在,session_start()函數可以接收一個陣列作為參數,可以覆寫php.ini中session的設定項。 

例如,把cache_limiter設定為私有的,同時在閱讀完session後立即關閉。

session_start([&#39;cache_limiter&#39; => &#39;private&#39;,
               &#39;read_and_close&#39; => true,
]);

16、生成器的回傳值

在PHP5.5引入生成器的概念。生成器函數每執行一次就得到一個yield標識的值。在PHP7中,當生成器迭代完成後,可以取得此生成器函數的回傳值。透過Generator::getReturn()得到。

function generator() {
    yield 1;
    yield 2;
    yield 3;
    return "a";
}

$generatorClass = ("generator")();
foreach ($generatorClass as $val) {
    echo $val ." ";

}
echo $generatorClass->getReturn();

輸出為:1 2 3 a

17、生成器中引入其他生成器

在生成器中可以引入另一個或幾個生成器,只需要寫yield from functionName1

function generator1() {
    yield 1;
    yield 2;
    yield from generator2();
    yield from generator3();
}

function generator2() {
    yield 3;
    yield 4;
}

function generator3() {
    yield 5;
    yield 6;
}

foreach (generator1() as $val) {
    echo $val, " ";
}

輸出:1 2 3 4 5 6

18、透過define()定義常數數組

define(&#39;ANIMALS&#39;, [&#39;dog&#39;, &#39;cat&#39;, &#39;bird&#39;]);
echo ANIMALS[1]; // outputs "cat"

php7.1的新功能:

#1、可為空(Nullable)類型

類型現在允許為空,當啟用這個特性時,傳入的參數或函數傳回的結果要不是給定的類型,就是null 。可以透過在類型前面加上一個問號來使之成為可為空的。

function test(?string $name) {
    var_dump($name);
}

以上例程會輸出:

string(5) "tpunt"
NULL
Uncaught Error: Too few arguments to function test(), 0 passed in...

2、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 ,并且不会产生任何警告。这么做的原因是不想影响更高层次的方法。

3、短数组语法 Symmetric array destructuring

短数组语法([])现在可以用于将数组的值赋给一些变量(包括在foreach中)。 这种方式使从数组中提取值变得更为容易。

$data = [
    [&#39;id&#39; => 1, &#39;name&#39; => &#39;Tom&#39;],
    [&#39;id&#39; => 2, &#39;name&#39; => &#39;Fred&#39;],
];
while ([&#39;id&#39; => $id, &#39;name&#39; => $name] = $data) {
    // logic here with $id and $name
}

 4、类常量可见性

现在起支持设置类常量的可见性。

class ConstDemo
{
    const PUBLIC_CONST_A = 1;
    public const PUBLIC_CONST_B = 2;
    protected const PROTECTED_CONST = 3;
    private const PRIVATE_CONST = 4;
}

5、iterable 伪类

现在引入了一个新的被称为iterable的伪类 (与callable类似)。 这可以被用在参数或者返回值类型中,它代表接受数组或者实现了Traversable接口的对象。 至于子类,当用作参数时,子类可以收紧父类的iterable类型到array 或一个实现了Traversable的对象。对于返回值,子类可以拓宽父类的 array或对象返回值类型到iterable。

function iterator(iterable $iter) {
    foreach ($iter as $val) {
        //
    }
}

6、多异常捕获处理

一个catch语句块现在可以通过管道字符(|)来实现多个异常的捕获。 这对于需要同时处理来自不同类的不同异常时很有用。

try {
    // some code
} catch (FirstException | SecondException $e) {
    // handle first and second exceptions
} catch (\Exception $e) {
    // ...
}

7、list()现在支持键名

现在list()支持在它内部去指定键名。这意味着它可以将任意类型的数组 都赋值给一些变量(与短数组语法类似)

$data = [
    [&#39;id&#39; => 1, &#39;name&#39; => &#39;Tom&#39;],
    [&#39;id&#39; => 2, &#39;name&#39; => &#39;Fred&#39;],
];
while (list(&#39;id&#39; => $id, &#39;name&#39; => $name) = $data) {
    // logic here with $id and $name
}

8、支持为负的字符串偏移量

现在所有接偏移量的内置的基于字符串的函数都支持接受负数作为偏移量,包括数组解引用操作符([]).

var_dump("abcdef"[-2]);
var_dump(strpos("aabbcc", "b", -3));

以上例程会输出:

string (1) "e"
int(3)

9、ext/openssl 支持 AEAD

通过给openssl_encrypt()和openssl_decrypt() 添加额外参数,现在支持了AEAD (模式 GCM and CCM)。 
通过 Closure::fromCallable() 将callables转为闭包 
Closure新增了一个静态方法,用于将callable快速地 转为一个Closure 对象。

class Test {
    public function exposeFunction() {
        return Closure::fromCallable([$this, &#39;privateFunction&#39;]);
    }
    private function privateFunction($param) {
        var_dump($param);
    }
}
$privFunc = (new Test)->exposeFunction();
$privFunc(&#39;some value&#39;);

以上例程会输出:

string(10) "some value"

10、异步信号处理 Asynchronous signal handling

A new function called pcntl_async_signals() has been introduced to enable asynchronous signal handling without using ticks (which introduce a lot of overhead). 
增加了一个新函数 pcntl_async_signals()来处理异步信号,不需要再使用ticks(它会增加占用资源)

pcntl_async_signals(true); // turn on async signals
pcntl_signal(SIGHUP,  function($sig) {
    echo "SIGHUP\n";
});
posix_kill(posix_getpid(), SIGHUP);

以上例程会输出:

SIGHUP

11、HTTP/2 服务器推送支持 ext/curl

Support for server push has been added to the CURL extension (requires version 7.46 and above). This can be leveraged through the curl_multi_setopt() function with the new CURLMOPT_PUSHFUNCTION constant. The constants CURL_PUST_OK and CURL_PUSH_DENY have also been added so that the execution of the server push callback can either be approved or denied. 
翻译: 
对于服务器推送支持添加到curl扩展(需要7.46及以上版本)。 
可以通过用新的CURLMOPT_PUSHFUNCTION常量 让curl_multi_setopt()函数使用。 
也增加了常量CURL_PUST_OK和CURL_PUSH_DENY,可以批准或拒绝 服务器推送回调的执行

相关文章推荐:

php7和php5有什么不同之处?php5与php7之间的对比

PHP新特性:finally关键字的用法

以上是PHP7.0和php7.1中的語法新功能的總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn