PHP 7 修改了什麼呢 --1

PHP7是什麼鬼?

PHP7是PHP編程語言的一個主要版本,並號稱是開發Web應用程序的一次革命,可開發和交付移動企業和雲應用。此版本被認爲是PHP在2004年發佈PHP5後最重要的變化。php

新功能

PHP7有加入幾十個功能,最顯著的是下面提到 -編程

改進的性能 - PHPNG代碼合併在PHP7中,這是比 PHP5快兩倍;

下降內存消耗 - 優化後PHP7使用較少的資源;

標量類型聲明 - 如今,參數和返回值類型能夠被強制執行;

一致性的64位支持 - 64位架構機器持續支持;

改進異常層次結構 - 異常層次結構獲得改善;

許多致命錯誤轉換成異常 - 異常的範圍增大覆蓋爲許多致命的錯誤轉化異常;

安全隨機數發生器 - 加入新的安全隨機數生成器的API;

已過期的API和擴展刪除 - 不一樣的舊的和不支持的應用程序和擴展,從最新的版本中刪除;
null合併運算符(??)的新空合併運算符被加入;
返回和標量類型聲明支持返回類型和參數類型也被加入;
增長了對匿名匿名類的支持;
零成本聲明支持零成本加入斷言。

PHP7使用新的 Zend Engine 3.0 提升應用程序性能兩倍,比PHP5.6 低了 50% 的內存消耗。 它能夠服務於更多的併發用戶,無需任何額外的硬件。考慮到當今的工做量 PHP7設計並重構。數組

PHP7 - 標量類型聲明

在PHP7有一個新的功能,標量類型聲明已被引入。標量類型聲明有兩種選擇:瀏覽器

強制 - 強制性是默認模式,不須要指定。

嚴格 - 嚴格模式有明確的暗示。

如下幾種類型的函數參數能夠經過上述方式強制執行:安全

int

float

bool

string

interfaces

array

callable

示例 - 強制模式架構

<?php
// Coercive mode
function sum(int ...$ints)
{
return array_sum($ints);
}併發

print(sum(2, '3', 4.1));
?>app

瀏覽器將產生如下輸出 -dom

9編程語言

示例 - 嚴格模式

<?php
// Strict mode
declare(strict_types=1);

function sum(int ...$ints)
{
return array_sum($ints);
}

print(sum(2, '3', 4.1));
?>

瀏覽器將產生如下輸出 -

Fatal error: Uncaught TypeError: Argument 2 passed to sum() must be of the type integer, string given, ..

PHP7 - 返回類型聲明

在PHP7中有一個新的功能,已引入返回類型聲明。返回類型聲明指定一個函數的返回值類型。如下類型返回類型是能夠聲明的:

int

float

bool

string

interfaces

array

callable

示例 - 有效的返回類型

<?php
declare(strict_types=1);

function returnIntValue(int $value): int
{
return $value;
}

print(returnIntValue(5));
?>

瀏覽器將產生如下輸出-

5

示例 - 無效的返回類型

<?php
declare(strict_types=1);

function returnIntValue(int $value): int
{
return $value + 1.0;
}

print(returnIntValue(5));
?>

這將產生如下瀏覽器輸出 -

Fatal error: Uncaught TypeError: Return value of returnIntValue() must be of the type integer, float returned

PHP7 - Null合併運算符

PHP7一個新的功能,空合併運算符(??)已經推出。它是用來與isset()函數函數一塊兒替換三元操做。若是存在且不是 NULL 空合併運算符返回它的第一個操做數;不然返回第二個操做數。
示例

<?php
// fetch the value of $_GET['user'] and returns 'not passed'
// if username is not passed
$username = $_GET['username'] ?? 'not passed';

print($username);
print("<br/>");

// Equivalent code using ternary operator
$username = isset($_GET['username']) ? $_GET['username'] : 'not passed';

print($username);
print("<br/>");
// Chaining ?? operation
$username = $_GET['username'] ?? $_POST['username'] ?? 'not passed';

print($username);
?>

這將在瀏覽器產生如下輸出 -

not passed
not passed
not passed

PHP7飛船操做符

在PHP7中有一個新的功能-飛船操做符相繼引入。它是用於比較兩個表達式。當第一個表達式較第二個表達式分別小於,等於或大於時它分別返回-1,0或1。
示例

<?php
//integer comparison
print( 1 <=> 1);print("<br/>");
print( 1 <=> 2);print("<br/>");
print( 2 <=> 1);print("<br/>");
print("<br/>");
//float comparison
print( 1.5 <=> 1.5);print("<br/>");
print( 1.5 <=> 2.5);print("<br/>");
print( 2.5 <=> 1.5);print("<br/>");
print("<br/>");
//string comparison
print( "a" <=> "a");print("<br/>");
print( "a" <=> "b");print("<br/>");
print( "b" <=> "a");print("<br/>");
?>

這將在瀏覽器產生如下輸出 -

0
-1
1

0
-1
1

0
-1
1

PHP7 - 常量數組

數組常量如今可使用 define() 函數定義。在PHP5.6中,它們只能使用const關鍵字定義。
示例

<?php
//define a array using define function
define('animals', [
'dog',
'cat',
'bird'
]);

print(animals[1]);
?>

這將在瀏覽器產生如下輸出 -

cat

PHP7 - 匿名類

PHP7 - 匿名類

匿名類如今可使用 new class 來定義。匿名類可使用來代替完整的類定義。
示例

<?php
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) {

print($msg);

}
});

$app->getLogger()->log("My first Log Message");
?>

這將在瀏覽器產生如下輸出 -

My first Log Message

PHP7 - Closure::call()

Closure::call() 方法加入到臨時綁定(bindTo)的對象範圍,以簡便方式封閉和調用它 它相比綁定到PHP5.6性能更快。
示例 - PHP7以前版本

<?php
class A {
private $x = 1;
}

// Define a closure Pre PHP 7 code
$getValue = function() {
return $this->x;
};

// Bind a clousure
$value = $getValue->bindTo(new A, 'A');

print($value());
?>

這將在瀏覽器產生如下輸出 -

1

示例-PHP7+

<?php
class A {
private $x = 1;
}

// PHP 7+ code, Define
$value = function() {
return $this->x;
};

print($value->call(new A));
?>

這將在瀏覽器產生如下輸出 -

1

PHP7- 過濾unserialize()

PHP7引入了過濾 unserialize()函數以在反序列化不受信任的數據對象時提供更好的安全性。它能夠防止可能的代碼注入,使開發人員可以使用序列化白名單類。
示例

<?php
class MyClass1 {
public $obj1prop;
}
class MyClass2 {
public $obj2prop;
}

$obj1 = new MyClass1();
$obj1->obj1prop = 1;
$obj2 = new MyClass2();
$obj2->obj2prop = 2;

$serializedObj1 = serialize($obj1);
$serializedObj2 = serialize($obj2);

// default behaviour that accepts all classes
// second argument can be ommited.
// if allowed_classes is passed as false, unserialize converts all objects into __PHP_Incomplete_Class object
$data = unserialize($serializedObj1 , ["allowed_classes" => true]);

// converts all objects into __PHP_Incomplete_Class object except those of MyClass1 and MyClass2
$data2 = unserialize($serializedObj2 , ["allowed_classes" => ["MyClass1", "MyClass2"]]);

print($data->obj1prop);
print("<br/>");
print($data2->obj2prop);
?>

這將在瀏覽器產生如下輸出 -

1
2

PHP7 - 國際字符

在PHP7,新的 IntlChar 類添加其目的是公開更多的ICU功能。 這個類定義了許多可用於操縱Unicode字符的靜態方法和常數。你須要在使用這個類以前安裝 Intl 擴展。
示例

<?php
printf('%x', IntlChar::CODEPOINT_MAX);
print (IntlChar::charName('@'));
print(IntlChar::ispunct('!'));
?>

這將在瀏覽器產生如下輸出 -

10ffff
COMMERCIAL AT
true

PHP7 - CSPRNG

在PHP7,如下兩個新的函數引入以產生一個跨平臺的方式加密安全整數和字符串。

random_bytes() - 生成加密安全僞隨機字節。

random_int() - 生成加密安全僞隨機整數。

random_bytes()
random_bytes()適合於使用來生成密碼,密碼學隨機的任意長度的字符串,如:生成 salt,密鑰或初始向量。
語法

string random_bytes ( int $length )

參數

length - 返回隨機串的字節長度

返回值

返回包含加密安全隨機字節的請求數量的字符串。

錯誤/異常

若是沒法找到隨機性的適當源,將引起異常
若是給定參數無效,TypeError將被拋出
若是給出字節長度無效,錯誤將被拋出

示例

<?php
$bytes = random_bytes(5);
print(bin2hex($bytes));
?>

這將在瀏覽器產生如下輸出 -

54cc305593

random_int()
random_int()產生適合於用於結果是很是重要的加密隨機整數。
語法

int random_int ( int $min , int $max )

參數

min - 返回最小值,它必須是PHP_INT_MIN或更大的值

max - 返回最大值,它必須是小於或等於PHP_INT_MAX

返回值

返回最小值(min)到最大(max)的範圍內,包括加密安全隨機整數。

錯誤/異常

若是沒法找到隨機性一個適當的源,將引起異常
若是給定參數無效,TypeError 將被拋出
若是 max 小於 min 時,錯誤將被拋出

示例

<?php
print(random_int(100, 999));
print("
");
print(random_int(-1000, 0));
?>

這將在瀏覽器產生如下輸出 -

614-882

相關文章
相關標籤/搜索