1. 程式人生 > >php7新特性學習

php7新特性學習

1、標量型別宣告
在函式/方法的引數及返回值處宣告資料型別為某個具體的資料型別,則必須傳入或返回對應的資料型別,否則會報錯。

function inputint(int $a)
{
    echo $a;
}
function returnArray(): array
{

    return [1, 2, 3, 4];
}

2、null合併運算子
在php中三元表示式和isset()大量使用,在php7中引入了null合併運算子??,null合併運算子表示如果這個變數存在且值不為null,就返回該值,否則返回第二個運算元。

$username = isset($_GET['username']) ? $_GET['username'] : '';
//等價於
$username = $_GET['username'] ?? '';
//原格式  
$expr=$expr1?$expr1:$expr2  
//新格式  
$expr=$expr1?:$expr2

3、太空船操作符

太空船操作符兩側為數值時,兩邊相等返回0,左側大於右側返回1,左側小於右側,返回-1。
太空船操作符兩側為字串時,按從左到右的順序比較兩邊字串對應位置的Ascii編碼表中數值,直到在同一位置能返回非0結果或最後一位返回結果。

// 整數
echo 1 <=> 1; // 0 當左邊等於右邊的時候,返回0
echo 1 <=> 2; // -1  當左邊小於右邊,返回-1
echo 2 <=> 1; // 1  當左邊大於右邊,返回1

// 浮點數
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
 
// 字串
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1

4、define定義陣列
define在之前的版本是不能定義陣列的,現在可以定義陣列了

define('CONFIG',[
	'app_name' => 'application',
	'namespace' => 'app'
]);

5、use方法,批量匯入

/ PHP 7 之前的程式碼
use app\namespace\ClassA;
use app\namespace\ClassB;
use app\namespace\ClassC as C;

use function app\namespace\fn_a;
use function app\namespace\fn_b;
use function app\namespace\fn_c;

use const app\namespace\ConstA;
use const app\namespace\ConstB;
use const app\namespace\ConstC;

// PHP 7+ 及更高版本的程式碼
use app\namespace\{ClassA, ClassB, ClassC as C};
use function app\namespace\{fn_a, fn_b, fn_c};
use const app\namespace\{ConstA, ConstB, ConstC};

6、新的整除函式
intdiv()整除函式

var_dump(intdiv(10, 3));
//int(3)

7、為unserialize提供過濾
這個特性指在提供更安全的方式解包不可靠的資料,它通過白名單 的方式來防止潛在的程式碼注入。

// 轉換物件為 __PHP_Incomplete_Class 物件
$data = unserialize($foo, ["allowed_classes" => false]);

// 轉換物件為 __PHP_Incomplete_Class 物件,除了 MyClass 和 MyClass2,即過濾掉MyClass和MyClass2
$data = unserialize($foo, ["allowed_classes" => ["MyClass", "MyClass2"]);

// 預設接受所有類
$data = unserialize($foo, ["allowed_classes" => true]);

8、匿名類
現在支援通過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());

9、Unicode codepoint 轉譯語法

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

echo "\u{aa}";				//a
echo "\u{0000aa}";			//a
echo "\u{9999}";			//香

10、新增函式數函式random_bytes()、random_int()

random_bytes(int $length) 生成加密的偽隨機字串
random_int(int $min,int $max) 生成加密的偽隨機整數

11、生成器的返回值

在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

在生成器中可以引入另一個或幾個生成器,只需要寫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, " ";
}

12、foreach不再改變內部陣列指標
在PHP7之前,當陣列通過 foreach 迭代時,陣列指標會移動。現在開始,不再如此。

$array = [0, 1, 2];
foreach ($array as &$val) {
var_dump(current($array));
}
//PHP5輸出:

int(1)
int(2)
bool(false)

//PHP7輸出:
int(0)
int(0)
int(0)

當使用引用遍歷陣列時,現在 foreach 在迭代中能更好的跟蹤變化。例如,在迭代中新增一個迭代值到陣列中,參考下面的程式碼:

$array = [0];
foreach ($array as &$val) {
var_dump($val);
$array[1] = 1;
}

//PHP5輸出:
int(0)

//PHP7輸出:
int(0)
int(1)

13、十六進位制字串不再被認為是數字
含十六進位制字串不再被認為是數字

var_dump("0x123" == "291");
var_dump(is_numeric("0x123"));
var_dump("0xe" + "0x1");
var_dump(substr("foo", "0x1"));

//PHP5輸出:
bool(true)
bool(true)
int(15)
string(2) "oo"
//PHP7輸出:
bool(false)
bool(false)
int(0)
Notice: A non well formed numeric value encountered in /tmp/test.php on line 5
string(3) "foo"

14、被移除的函式
被移除的函式列表如下:

call_user_func() 和 call_user_func_array()從PHP 4.1.0開始被廢棄。

已廢棄的 mcrypt_generic_end() 函式已被移除,請使用mcrypt_generic_deinit()代替。

已廢棄的 mcrypt_ecb(), mcrypt_cbc(), mcrypt_cfb() 和 mcrypt_ofb() 函式已被移除。

set_magic_quotes_runtime(), 和它的別名 magic_quotes_runtime()已被移除. 它們在PHP 5.3.0中已經被廢棄,並且 在in PHP 5.4.0也由於魔術引號的廢棄而失去功能。

已廢棄的 set_socket_blocking() 函式已被移除,請使用stream_set_blocking()代替。

dl()在 PHP-FPM 不再可用,在 CLI 和 embed SAPIs 中仍可用。

GD庫中下列函式被移除:imagepsbbox()、imagepsencodefont()、imagepsextendfont()、imagepsfreefont()、imagepsloadfont()、imagepsslantfont()、imagepstext()

在配置檔案php.ini中,always_populate_raw_post_data、asp_tags、xsl.security_prefs被移除了。

15、new 操作符建立的物件不能以引用方式賦值給變數

class C {}
$c =& new C;
//PHP5輸出:
Deprecated: Assigning the return value of new by reference is deprecated in /tmp/test.php on line 3
//PHP7輸出:
Parse error: syntax error, unexpected 'new' (T_NEW) in /tmp/test.php on line 3

16、移除了類 ASP 和 類script 的PHP 標籤

使用類似 ASP 的標籤,以及 script 標籤來區分 PHP 程式碼的方式被移除。 受到影響的標籤有:<% %>、<%= %>、。

17、在數值溢位的時候,內部函式將會失敗

將浮點數轉換為整數的時候,如果浮點數值太大,導致無法以整數表達的情況下, 在之前的版本中,內部函式會直接將整數截斷,並不會引發錯誤。 在 PHP 7.0 中,如果發生這種情況,會引發 E_WARNING 錯誤,並且返回 NULL。

18、JSON 擴充套件已經被 JSOND 取代

JSON 擴充套件已經被 JSOND 擴充套件取代。 對於數值的處理,有以下兩點需要注意的:
第一,數值不能以點號(.)結束 (例如,數值 34. 必須寫作 34.0 或 34)。 第二,如果使用科學計數法表示數值,e 前面必須不是點號(.) (例如,3.e3 必須寫作 3.0e3 或 3e3)

19、INI 檔案中 # 註釋格式被移除

在配置檔案INI檔案中,不再支援以 # 開始的註釋行, 請使用 ;(分號)來表示註釋。 此變更適用於 php.ini 以及用 parse_ini_file() 和 parse_ini_string() 函式來處理的檔案。

20、$HTTP_RAW_POST_DATA 被移除

不再提供 $HTTP_RAW_POST_DATA 變數。 請使用 php://input 作為替代。

21、yield 變更為右聯接運算子

在使用 yield 關鍵字的時候,不再需要括號, 並且它變更為右聯接操作符,其運算子優先順序介於 print 和 => 之間。 這可能導致現有程式碼的行為發生改變。可以通過使用括號來消除歧義。

echo yield -1;
// 在之前版本中會被解釋為:
echo (yield) - 1;
// 現在,它將被解釋為:
echo yield (-1);
yield $foo or die;
// 在之前版本中會被解釋為:
yield ($foo or die);
// 現在,它將被解釋為:
(yield $foo) or die;