two+few+arguments+php,PHP5.5 ~ PHP7.2 新特性整理

PHP5.5 ~ PHP7.2 新特性整理

一、從PHP 5.5.x 移植到 PHP 5.6.x

使用表達式定義常量

在之前的 PHP 版本中, 必須使用靜態值來定義常量,聲明屬性以及指定函數參數默認值。 現在你可以使用包括數值、字符串字面量以及其他常量在內的數值表達式來 定義常量、聲明屬性以及設置函數參數默認值。

const ONE = 1;

const TWO = ONE * 2;

class C {

const THREE = TWO + 1;

const ONE_THIRD = ONE / self::THREE;

const SENTENCE = 'The value of THREE is '.self::THREE;

}

現在可以通過 const 關鍵字來定義類型為 array 的常量。

const ARR = ['a', 'b'];

echo ARR[0];

使用 ... 運算符定義變長參數函數

現在可以不依賴 func_get_args(), 使用 ... 運算符 來實現 變長參數函數。

function f($req, $opt = null, ...$params) {

// $params 是一個包含了剩余參數的數組

printf('$req: %d; $opt: %d; number of params: %d'."\n",

$req, $opt, count($params));

}

f(1);

f(1, 2);

f(1, 2, 3);

f(1, 2, 3, 4);

?>

以上例程會輸出:

$req: 1; $opt: 0; number of params: 0

$req: 1; $opt: 2; number of params: 0

$req: 1; $opt: 2; number of params: 1

$req: 1; $opt: 2; number of params: 2

使用 ... 運算符進行參數展開

在調用函數的時候,使用 ... 運算符, 將 數組 和 可遍歷 對象展開為函數參數。 在其他編程語言,比如 Ruby中,這被稱為連接運算符。

function add($a, $b, $c) {

return $a + $b + $c;

}

$operators = [2, 3];

echo add(1, ...$operators);

?>

以上例程會輸出:

6

use function 以及 use const

use 運算符 被進行了擴展以支持在類中導入外部的函數和常量。 對應的結構為 use function 和 use const。

namespace Name\Space {

const FOO = 42;

function f() { echo __FUNCTION__."\n"; }

}

namespace {

use const Name\Space\FOO;

use function Name\Space\f;

echo FOO."\n";

f();

}

?>

以上例程會輸出:

42

Name\Space\f

使用 hash_equals() 比較字符串避免時序攻擊

二、從PHP 5.6.x 移植到 PHP 7.0.x

標量類型聲明

標量類型聲明 有兩種模式: 強制 (默認) 和 嚴格模式。 現在可以使用下列類型參數(無論用強制模式還是嚴格模式): 字符串(string), 整數 (int), 浮點數 (float), 以及布爾值 (bool)。

// Coercive mode

function sumOfInts(int ...$ints)

{

return array_sum($ints);

}

var_dump(sumOfInts(2, '3', 4.1));

以上例程會輸出:

int(9)

返回值類型聲明

PHP 7 增加了對返回類型聲明的支持。 類似于參數類型聲明,返回類型聲明指明了函數返回值的類型。可用的類型與參數聲明中可用的類型相同。

function arraysSum(array ...$arrays): array

{

return array_map(function(array $array): int {

return array_sum($array);

}, $arrays);

}

null合并運算符

由于日常使用中存在大量同時使用三元表達式和 isset()的情況, 我們添加了null合并運算符 (??) 這個語法糖。如果變量存在且值不為NULL, 它就會返回自身的值,否則返回它的第二個操作數。

// Fetches the value of $_GET['user'] and returns 'nobody' if it does not exist.

$username = $_GET['user'] ?? 'nobody';

// This is equivalent to:

$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

// Coalesces can be chained: this will return the first defined value out of $_GET['user'], $_POST['user'], and 'nobody'.

$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';

?>

太空船操作符(組合比較符)

太空船操作符用于比較兩個表達式。當$a小于、等于或大于$b時它分別返回-1、0或1。 比較的原則是沿用 PHP 的常規比較規則進行的。

// 整數

echo 1 <=> '1'; // 0

echo 1 <=> 2; // -1

echo 2 <=> 1; // 1

// 浮點數

echo '1.50' <=> 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

?>

通過 define() 定義常量數組

Array 類型的常量現在可以通過 define() 來定義。在 PHP5.6 中僅能通過 const 定義。

define('ANIMALS', [

'dog',

'cat',

'bird'

]);

echo ANIMALS[1]; // 輸出 "cat"

Closure::call()

Closure::call() 現在有著更好的性能,簡短干練的暫時綁定一個方法到對象上閉包并調用它。

class A {private $x = 1;}

// PHP 7 之前版本的代碼

$getXCB = function() {return $this->x;};

$getX = $getXCB->bindTo(new A, 'A'); // 中間層閉包

echo $getX();

// PHP 7+ 及更高版本的代碼

$getX = function() {return $this->x;};

echo $getX->call(new A);

以上例程會輸出:

1

分組 use 聲明

從同一 namespace 導入的類、函數和常量現在可以通過單個 use 語句 一次性導入了。

// PHP 7 之前的代碼

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;

// PHP 7+ 及更高版本的代碼

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

?>

生成器可以返回表達式

此特性基于 PHP 5.5 版本中引入的生成器特性構建的。 它允許在生成器函數中通過使用 return 語法來返回一個表達式 (但是不允許返回引用值), 可以通過調用 Generator::getReturn() 方法來獲取生成器的返回值, 但是這個方法只能在生成器完成產生工作以后調用一次。

整數除法函數 intdiv()

從PHP 7.0.x 移植到 PHP 7.1.x

可為空(Nullable)類型

參數以及返回值的類型現在可以通過在類型前加上一個問號使之允許為空。 當啟用這個特性時,傳入的參數或者函數返回的結果要么是給定的類型,要么是 null 。

function testReturn(): ?string

{

return 'elePHPant';

}

var_dump(testReturn());

function testReturn(): ?string

{

return null;

}

var_dump(testReturn());

function test(?string $name)

{

var_dump($name);

}

test('elePHPant');

test(null);

test();

以上例程會輸出:

string(10) "elePHPant"

NULL

string(10) "elePHPant"

NULL

Uncaught Error: Too few arguments to function test(), 0 passed in...

Void 函數

一個新的返回值類型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)

Symmetric array destructuring

短數組語法([])現在作為list()語法的一個備選項,可以用于將數組的值賦給一些變量(包括在foreach中)。

$data = [

[1, 'Tom'],

[2, 'Fred'],

];

// list() style

list($id1, $name1) = $data[0];

// [] style

[$id1, $name1] = $data[0];

// list() style

foreach ($data as list($id, $name)) {

// logic here with $id and $name

}

// [] style

foreach ($data as [$id, $name]) {

// logic here with $id and $name

}

類常量可見性

現在起支持設置類常量的可見性。

class ConstDemo

{

const PUBLIC_CONST_A = 1;

public const PUBLIC_CONST_B = 2;

protected const PROTECTED_CONST = 3;

private const PRIVATE_CONST = 4;

}

iterable 偽類

現在引入了一個新的被稱為iterable的偽類 (與callable類似)。 這可以被用在參數或者返回值類型中,它代表接受數組或者實現了Traversable接口的對象。 至于子類,當用作參數時,子類可以收緊父類的iterable類型到array 或一個實現了Traversable的對象。對于返回值,子類可以拓寬父類的 array或對象返回值類型到iterable。

function iterator(iterable $iter) : iterable

{

foreach ($iter as $val) {

//

}

}

多異常捕獲處理

一個catch語句塊現在可以通過管道字符(|)來實現多個異常的捕獲。 這對于需要同時處理來自不同類的不同異常時很有用。

try {

// some code

} catch (FirstException | SecondException $e) {

// handle first and second exceptions

}

list()現在支持鍵名

現在list()和它的新的[]語法支持在它內部去指定鍵名。這意味著它可以將任意類型的數組 都賦值給一些變量(與短數組語法類似)

$data = [

["id" => 1, "name" => 'Tom'],

["id" => 2, "name" => 'Fred'],

];

// list() style

list("id" => $id1, "name" => $name1) = $data[0];

// [] style

["id" => $id1, "name" => $name1] = $data[0];

// list() style

foreach ($data as list("id" => $id, "name" => $name)) {

// logic here with $id and $name

}

// [] style

foreach ($data as ["id" => $id, "name" => $name]) {

// logic here with $id and $name

}

從PHP 7.1.x 移植到 PHP 7.2.x

新的對象類型

這種新的對象類型, object, 引進了可用于逆變(contravariant)參數輸入和協變(covariant)返回任何對象類型。

function test(object $obj) : object

{

return new SplQueue();

}

test(new StdClass());

允許重寫抽象方法(Abstract method)

當一個抽象類繼承于另外一個抽象類的時候,繼承后的抽象類可以重寫被繼承的抽象類的抽象方法。

abstract class A

{

abstract function test(string $s);

}

abstract class B extends A

{

// overridden - still maintaining contravariance for parameters and covariance for return

abstract function test($s) : int;

}

擴展了參數類型

重寫方法和接口實現的參數類型現在可以省略了。不過這仍然是符合LSP,因為現在這種參數類型是逆變的。

interface A

{

public function Test(array $input);

}

class B implements A

{

public function Test($input){} // type omitted for $input

}

允許分組命名空間的尾部逗號

命名空間可以在PHP 7中使用尾隨逗號進行分組引入。

use Foo\Bar\{

Foo,

Bar,

Baz,

};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534189.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534189.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534189.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

date設置時間_解決 IDEA 無法找到 java.util.Date 的問題

原文首發于 https://studyidea.cn/問題最近在項目中頻繁使用到 java.util.Date&#xff0c;但是使用 IDEA 提示查找 Date 類&#xff0c;卻無法找到 java.util.Date。可以看到&#xff0c;智能提示的結果沒有 java.util.Date。沒辦法&#xff0c;只能暫時手動導入該包。最近閑下…

mysql插入語句例句,一句簡單的MySql插入語句怎么寫 ?

守候你守候我insert into 表名 values(default,"名字","2011-04-15 12:22:25"); //default可以換成null------------------------------insert into 表名 (name,datetime) values("名字","2011-04-15 12:22:25");使用SQL語法大寫&…

vue key重復_【第2112期】 import { reactive } from #39;vue#39;

前言今日早讀文章由Anthony Fu授權分享。Anthony Fu&#xff0c;是 Vue 的 Core Team 的一員&#xff0c;在 Vue主要負責 vue/composition-api 這個項目的維護。這是一個面向 Vue 2 的插件&#xff0c;它在 Vue 2 中增加了 Vue 3 的 Composition API 的支持。最近也加入了 Vite…

matlab系統穩定性分析,控制系統穩定性分析的MATLAB實現

收稿日期 :200706220 基金項目 :周口師范學院青年基金資助項目(No. ZKNUQN200621) 作者簡介 :劉  偉(1976 - ) ,女 ,河南太康人 ,助教 ,碩士 ,主要從事電力系統及其自動化仿真研究. 第 25 卷 第 2 期 周口師范學院學報 2008 年 3 月 Vol. 25 No. 2 Journal of Zhoukou Normal …

路由器下一跳地址怎么判斷_網絡基本功三:細說路由器

介紹以太網交換機工作在第二層即數據鏈路層&#xff0c;用于在同一網絡內部轉發以太網幀。但是&#xff0c;當源和目的IP地址位于不同網絡時&#xff0c;以太網幀必須發送給路由器。路由器負責在不同網絡間傳輸報文&#xff0c;通過路由表來決定最佳轉發路徑。當主機將報文發送…

HTML多選mysql,html多選下拉框 | 學步園

一個jquery ui,實現html的多選下拉框&#xff0c;在下拉里面加checkbox&#xff0c;不改變頁面的提交特性&#xff0c;只是動態的改變select選中的多選數據。jsp頁面例子&#xff1a;pageEncoding"UTF-8" import"java.util.*,java.text.*"%>String path…

利用逆矩陣解線性方程組_經典Jacobi方法用于求解矩陣特征值

1、引言求解線性方程組在許多領域中都有重要應用&#xff0c;寫成矩陣的形式&#xff1a; 。求解 可以寫成&#xff1a; &#xff0c;這里需要求解矩陣 的逆。《線性代數》中給出的方法主要有兩類&#xff1a;1、設置增廣矩陣&#xff0c;利用高斯消元法&#xff0c;通過初等行…

filename: core/loader.php,使用第三方包后出現的這個錯誤,你們都遇到過嗎?

使用了一些第三方包&#xff0c;經常會發現&#xff0c;引入某些第三方包后(比如在laravel5.6中引入viacreative/sudo-su)&#xff0c;使用命令行工具會遇到這樣的錯誤提示&#xff0c;卸載了第三方包后重新安裝vendor目錄問題立馬解決。真是把人頭發都愁白了&#xff1a;PHP F…

python函數的作用域_python學習第五篇 函數 變量作用域

原博文 2019-07-18 23:40 ? 函數 函數是組合好的&#xff0c;可以重復使用的&#xff0c;用來實現單一或相關聯功能的代碼片段作用 能提高應用的模塊性和代碼的重復利用率函數的創建 第一函數的規則 1.函數代碼塊一def關鍵字開頭&#xff0c;后接函數標識符名稱和圓括號‘&…

js post中文亂碼 php,AJAX之POST數據中文亂碼如何解決

本文主要和大家分享AJAX之POST數據中文亂碼如何解決&#xff0c;前端使用encodeURI進行編碼&#xff0c;希望能幫助到大家。var param encodeURI(param);$.ajax({url: url,methodtype: "POST",async: false,timeout: 60000,contentType: "application/json&quo…

python遞歸 數字全排列_利用遞歸實現全排列(python)

利用遞歸實現全排列(python) """ 利用遞歸實現全排列 第一個位置可能有n種可能&#xff0c;第二個位置可能 有n-1種可能...... 代碼思路就是第一個位置可以和n個元素交換&#xff0c; 第二個元素可以和n-1個元素進行交換&#xff0c;到最 后一個輸出這次排列&am…

python pip使用_Python——pip的安裝與使用

pip 是 Python 包管理工具&#xff0c;該工具提供了對Python 包的查找、下載、安裝、卸載的功能。目前如果你在 python.org 下載最新版本的安裝包&#xff0c;則是已經自帶了該工具。Python 2.7.9 或 Python 3.4 以上版本都自帶 pip 工具。pip 官網&#xff1a;https://pypi.o…

php文章列表樣式,PHPCMS V9 文章列表循環樣式自定義方法

在此&#xff0c;再次分享Whidy的文章"phpcms文章列表循環不同樣式制作方法"&#xff0c;下面CMSYOU來與大家具體分享&#xff0c;原地址為http://whidy.net/phpcms-list-with-different-style.html&#xff0c;在這里感謝。大家在用PHPCMS系統做網站的時候,有時候在…

角速度求積分能得到歐拉角嗎_一個有趣的反常積分問題

今天物理考試&#xff0c;老師提到了一個有趣的積分問題。聽說是拉普拉斯變換的一個應用之一&#xff08;生成函數&#xff1f;&#xff09;&#xff0c;但是我沒聽過那個東西所以硬上了&#xff1a;D1&#xff09;試求積分 2) 試說明積分 的收斂性1&#xff09;對于第一問可以…

php計算1-100奇數的和,學習腳本1:計算100以內奇數和和偶數和 (筆記)

let I$[$I1]let I1let I 注意此處只有是原先數值加1才可用此方法上述三者運算是相同的- 減等 兩邊的變量前邊的減去后邊的變量之后把值再放到原來的變量上 加等 兩的的變量前邊的加上后邊的變量之后把值再放到原來的變量上* 乘等 兩邊的變量前邊的乘上后邊的變量之后把值再放到…

查看ie保存的表單_解決瀏覽器保存密碼自動填充問題

解決瀏覽器保存密碼自動填充問題問題描述話說有一天&#xff0c;我如往常一樣打開我的開發網站進行登錄操作。瀏覽器很平常的在我們進行登錄操作之后詢問我是否需要記住密碼&#xff0c;懶惰如我點擊了記住密碼。一切都很正常的進行著&#xff0c;沒有什么異常發生。然而&#…

java滿江紅1apk,滿江紅滿V版游戲下載_滿江紅滿V版安卓版游戲下載v1.0_3DM手游

喜歡玩精彩的傳奇游戲嗎&#xff1f;那就來《滿江紅滿V版》這款佳作中吧&#xff01;這款手游操作方式極其的簡單&#xff0c;且玩法自由度也很高&#xff0c;咱們將會置身于一座很精美熱血的魔幻大陸中&#xff0c;各種大伙熟悉的人物職業可供收集培養&#xff0c;極致精彩的P…

go get 的不再src目錄中_GO語言基礎進階教程:包的使用

Go語言使用包&#xff08;package&#xff09;這種語法元素來組織源碼&#xff0c;所有語法可見性均定義在package這個級別&#xff0c;與Java 、python等語言相比&#xff0c;這算不上什么創新&#xff0c;但與C傳統的include相比&#xff0c;則是顯得“先進”了許多。myblog …

python mysql 正則表達式,MySQL之正則表達式(REGEXP)

MySQL中正則表達式通常被用來檢索或替換符合某個模式的文本內容&#xff0c;根據指定的匹配模式匹配文中符合要求的特殊字符串。例如&#xff0c;從一個文件中提取電話號碼&#xff0c;查找一篇文章中重復的單詞或替換用戶輸入的敏感語匯等&#xff0c;這些地方都可以使用正則表…

pyecharts anaconda_Pyecharts安裝使用和繪圖案例

一次偶然的機會&#xff0c;接觸了pyecharts&#xff0c;發現做圖交互效果非常棒&#xff0c;便深究、摸索、入坑。這篇文章主要講述自己在安裝和使用中遇到的問題&#xff0c;解決方法&#xff0c;最后還會有pyecharts中自己比較喜歡的繪圖功能。pyecharts是一款將python與ech…