电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

令人期待的 PHP7.4

瀏覽:114日期:2022-09-11 13:50:24
PHP 7.4 有什么新功能?數組表達式中引入 Spread 運算符箭頭函數 2.0 (簡短閉包)NULL 合并運算符類型屬性 2.0弱引用協變返回和逆變參數預加載PHP7.4 又將廢棄什么功能呢?更改連接運算符的優先級棄用左關聯三元運算符

PHP 7.4 是下一個 PHP 7 的次要版本,預計將于 2019 年 11 月 28 日發布到 General Availability。讓我們來了解下 PHP 7.4 新增的功能,這些新功能將使 PHP 更快,更可靠。

當然,更令我期待是 PHP 8。因為 JIT 的一些提議,已經獲得批準,這可能成為 PHP 的又一個里程碑。

PHP 7.4 有什么新功能?#支持數組內解包 - 數組擴展運算符箭頭函數 2.0 (更加簡短的閉包)NULL 合并運算符弱引用協變返回和逆變參數預加載數組表達式中引入 Spread 運算符#

自 PHP 5.6 起可用,參數解包是將數組和 Traversable 解包為參數列表的語法。要解壓一個數組或 Traversable,必須以 ...(3 點)為前綴,如下例所示:

function test(...$args) { var_dump($args); } test(1, 2, 3);

然而 PHP 7.4 RFC 建議將此功能擴展到數組中去定義:

$arr = [...$args];

Spread 運算符的第一個好處就是性能,RPC 文檔指出:

Spread 運算符應該比array_merge擁有更好的性能。這不僅僅是 Spread 運算符是一個語法結構,而array_merge是一個方法。還是在編譯時,優化了高效率的常量數組

Spread 運算符的一個顯著優點是它支持任何可遍歷的對象,而該array_merge函數僅支持數組。

以下是數組中參數帶有 Spread 運算符的示例:

$parts = [’apple’, ’pear’]; $fruits = [’banana’, ’orange’, ...$parts, ’watermelon’]; var_dump($fruits);

如果在 PHP 7.3 或更早版本中運行此代碼,PHP 會拋出一個 Parse 錯誤:

Parse error: syntax error, unexpected ’...’ (T_ELLIPSIS), expecting ’]’ in /app/spread-operator.php on line 3

相反,PHP 7.4 將返回一個數組

array(5) { [0]=> string(6) 'banana' [1]=> string(6) 'orange' [2]=> string(5) 'apple' [3]=> string(4) 'pear' [4]=> string(10) 'watermelon' }

RFC 聲明我們可以多次擴展同一個數組。此外,我們可以在數組中的任何位置使用 Spread Operator 語法,因為可以在 spread 運算符之前或之后添加常規元素。因此,以下代碼將按預期工作:

$arr1 = [1, 2, 3]; $arr2 = [4, 5, 6]; $arr3 = [...$arr1, ...$arr2]; $arr4 = [...$arr1, ...$arr3, 7, 8, 9];

也可以將函數返回的數組作為參數,放到新數組中:

function buildArray(){ return [’red’, ’green’, ’blue’]; } $arr1 = [...buildArray(), ’pink’, ’violet’, ’yellow’];

PHP 7.4 輸出以下數組:

array(6) { [0]=> string(3) 'red' [1]=> string(5) 'green' [2]=> string(4) 'blue' [3]=> string(4) 'pink' [4]=> string(6) 'violet' [5]=> string(6) 'yellow' }

我們也可以使用生成器:

function generator() { for ($i = 3; $i <= 5; $i++) { yield $i; } } $arr1 = [0, 1, 2, ...generator()];

但不允許通過引用傳遞的方式。請考慮以下示例:

$arr1 = [’red’, ’green’, ’blue’]; $arr2 = [...&$arr1];

如果我們嘗試通過傳遞引用的方式,PHP 會拋出以下 Parse 錯誤:

Parse error: syntax error, unexpected ’&’ in /app/spread-operator.php on line 3

如果第一個數組的元素是通過引用存儲的,那么它們也通過引用存儲在第二個數組中。這是一個例子:

$arr0 = ’red’; $arr1 = [&$arr0, ’green’, ’blue’]; $arr2 = [’white’, ...$arr1, ’black’];

這是我們用 PHP 7.4 獲得的:

array(5) { [0]=> string(5) 'white' [1]=> &string(3) 'red' [2]=> string(5) 'green' [3]=> string(4) 'blue' [4]=> string(5) 'black' }箭頭函數 2.0 (簡短閉包)#

在 PHP 中,匿名函數被認為是非常冗長且難以實現和難以維護的,RFC 建議引入更簡單,更清晰的箭頭函數(或簡短閉包)語法,這樣我們就可以簡潔地編寫代碼。

在 PHP 7.4 以前:

function cube($n){ return ($n * $n * $n); } $a = [1, 2, 3, 4, 5]; $b = array_map(’cube’, $a); print_r($b);

PHP 7.4 允許使用更簡潔的語法,上面的函數可以重寫如下:

$a = [1, 2, 3, 4, 5]; $b = array_map(fn($n) => $n * $n * $n, $a); print_r($b);

目前,由于語言結構,匿名函數(閉包)可以使用use繼承父作用域中定義的變量,如下所示:

$factor = 10; $calc = function($num) use($factor){ return $num * $factor; };

但是在 PHP 7.4 中,父級作用域的值是通過隱式捕獲的(隱式按值的作用域進行綁定)。所以我們可以用一行來完成一下這個函數:

$factor = 10; $calc = fn($num) => $num * $factor;

父級作用域定義的變量可以用于箭頭函數,它跟我們使用use是等價的,并且不可能被父級所修改。

新語法是對語言的一個很大改進,因為它允許我們構建更易讀和可維護的代碼。

NULL 合并運算符#

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

$username = $_GET[’user’] ?? ‘nobody’;

這段代碼的作用非常簡單:它獲取請求參數并設置默認值(如果它不存在)。但是在 RFC 這個例子中,如果我們有更長的變量名稱呢?

$this->request->data[’comments’][’user_id’] = $this->request->data[’comments’][’user_id’] ?? ’value’;

長遠來看,這段代碼可能難以維護。因此,旨在幫助開發人員編寫更直觀的代碼,這個 RFC 建議引入 null 合并等于運算符 (null_coalesce_equal_operator)??=,所以我們可以敲下面這段代碼來替代上面的這段代碼:

$this->request->data[’comments’][’user_id’] ??= ‘value’;

如果左側參數的值為null,則使用右側參數的值。

注意,雖然 coalesce 運算符??是一個比較運算符,但??=它是賦值運算符。

類型屬性 2.0#

類型的聲明,類型提示,以及指定確定類型的變量傳遞給函數或類的方法。其中類型提示是在 PHP5 的時候有的一個功能,PHP 7.2 的時候添加了object的數據類型。而 PHP7.4 更是增加了主類屬性聲明,看下面的例子:

class User { public int $id; public string $name; }

除了void和callable外,所有的類型都支持:

public int $scalarType; protected ClassName $classType; private ?ClassName $nullableClassType;

為什么不支持void和callable?下面是 RFC 的解釋

Thevoidtype is not supported, because it is not useful and has unclear semantics.不支持void類型,是因為它沒用,并且語義不清晰。

Thecallabletype is not supported, because its behavior is context dependent.不支持callable類型,因為其行為取決于上下文。

因此,我們可以放心使用bool,int,float,string,array,object,iterable,self,parent,當然還有我們很少使用的 nullable空允許 (?type)

所以你可以在 PHP7.4 中這樣敲代碼:

// 靜態屬性的類型 public static iterable $staticProp; // var 中聲明屬性 var bool $flagl // 設置默認的值 // 注意,只有 nullable 的類型,才能設置默認值為 null public string $str = 'foo'; public ?string $nullableStr = null; // 多個同類型變量的聲明 public float $x, $y;

如果我們傳遞不符合給定類型的變量,會發生什么?

class User { public int $id; public string $name; } $user = new User; $user->id = 10; $user->name = []; // 這個會產生一個致命的錯誤 Fatal error: Uncaught TypeError: Typed property User::$name must be string, array used in /app/types.php:9弱引用#

在這個 RFC 中,提議引入WeakReference這個類,弱引用允許編碼時保留對對象的引用,該引用不會阻止對象被破壞;這對于實現類似于緩存的結構非常有用。

該提案的作者 Nikita Popov 給出的一個例子:

$object = new stdClass; $weakRef = WeakReference::create($object); var_dump($weakRef->get()); unset($object); var_dump($weakRef->get()); // 第一次 var_dump object(stdClass)#1 (0) {} // 第二次 var_dump,當 object 被銷毀的時候,并不會拋出致命錯誤 NULL協變返回和逆變參數#

協變和逆變百度百科的解釋

Invariant (不變): 包好了所有需求類型Covariant (協變):類型從通用到具體

Contravariant (逆變): 類型從具體到通用

目前,PHP 主要具有Invariant的參數類型,并且大多數是Invariant的返回類型,這就意味著當我是 T 參數類型或者返回類型時,子類也必須是 T 的參數類型或者返回類型。但是往往會需要處理一些特殊情況,比如具體的返回類型,或者通用的輸入類型。

而 RFC 的這個提案就提議,PHP7.4 添加協變返回和逆變參數,以下是提案給出來的例子:

協變返回:

interface Factory { function make(): object; } class UserFactory implements Factory { // 將比較泛的 object 類型,具體到 User 類型 function make(): User; }

逆變參數:

interface Concatable { function concat(Iterator $input); } class Collection implements Concatable { // 將比較具體的 `Iterator`參數類型,逆變成接受所有的 `iterable`類型 function concat(iterable $input) {/* . . . */} }預加載#

這個 RFC 是由 Dmitry Stogov 提出的,預加載是在模塊初始化的時候,將庫和框架加載到 OPCache 中的過程,如下圖所示

令人期待的 PHP7.4

引用他的原話:

On server startup – before any application code is run – we may load a certain set of PHP files into memory – and make their contents “permanently available” to all subsequent requests that will be served by that server. All the functions and classes defined in these files will be available to requests out of the box, exactly like internal entities.

服務器啟動時 - 在運行任何應用程序代碼之前 - 我們可以將一組 PHP 文件加載到內存中 - 并使得這些預加載的內容,在后續的所有請求中 “永久可用”。這些文件中定義的所有函數和類在請求時,就可以開箱即用,與內置函數相同。

預加載由php.ini的opcache.preload進行控制。這個參數指定在服務器啟動時編譯和執行的 PHP 腳本。此文件可用于預加載其他文件,或通過 opcache_compile_file()函數

這在性能上有很大的提升,但是也有一個很明顯的缺點,RFC 提出來了

preloaded files remain cached in opcache memory forever. Modification of their corresponding source files won’t have any effect without another server restart.

預加載的文件會被永久緩存在 opcache 內存中。在修改相應的源文件時,如果沒有重啟服務,修改就不會生效。

PHP7.4 又將廢棄什么功能呢?#更改連接運算符的優先級更改連接運算符的優先級#

目前,在 PHP 中+,-算術運算符和.字符串運算符是左關聯的, 而且它們具有相同的優先級。例如:

echo 'sum: ' . $a + $b;

在 PHP 7.3 中,此代碼生成以下警告:

Warning: A non-numeric value encountered in /app/types.php on line 4

這是因為這段代碼是從左往右開始的,所以等同于:

echo ('$sum: ' . $a) + $b;

針對這個問題,這個 RFC 建議更改運算符的優先級,使.的優先級低于+,-這兩個運算符,以便在字符串拼接之前始終執行加減法。所以這行代碼應該等同于以下內容:

echo '$sum: ' . ($a + $b);

這個提案分為兩步走:

從 PHP7.4 開始,當遇見+-和.在沒有指明執行優先級時,會發出一個棄用通知。

而真正調整優先級的這個功能,會在 PHP8 中執行

棄用左關聯三元運算符#

在 PHP 中,三元運算符與許多其他語言不同,它是左關聯的。而根據 Nikita Popof 的所說:對于在不同語言之間切換的編程人員來說,會令他們感到困擾。

比如以下的例子,在 PHP 中是正確的:

$b = $a == 1 ? ’one’ : $a == 2 ? ’two’ : $a == 3 ? ’three’ : ’other’;

它會被解釋為:

$b = (($a == 1 ? ’one’ : $a == 2) ? ’two’ : $a == 3) ? ’three’ : ’other’;

對于這種復雜的三元表現形式,它很有可能不是我們希望的方式去工作,容易造成錯誤。因此,這個 RFC 提議刪除并棄用三元運算符的左關聯使用,強制編程人員使用括號。

這個提議分為兩步執行:

從 PHP7.4 開始,沒有明確使用括號的嵌套三元組將拋出棄用警告。從 PHP 8.0 開始,將出現編譯運行時錯誤。
標簽: PHP
相關文章:
主站蜘蛛池模板: ETFE膜结构_PTFE膜结构_空间钢结构_膜结构_张拉膜_浙江萬豪空间结构集团有限公司 | 工业废水处理|污水处理厂|废水治理设备工程技术公司-苏州瑞美迪 今日娱乐圈——影视剧集_八卦娱乐_明星八卦_最新娱乐八卦新闻 | 火锅加盟_四川成都火锅店加盟_中国火锅连锁品牌十强_朝天门火锅【官网】 | 圆形振动筛_圆筛_旋振筛_三次元振动筛-河南新乡德诚生产厂家 | 尚为传动-专业高精密蜗轮蜗杆,双导程蜗轮蜗杆,蜗轮蜗杆减速机,蜗杆减速机生产厂家 | 环比机械| 仓储笼_仓储货架_南京货架_仓储货架厂家_南京货架价格低-南京一品仓储设备制造公司 | 苏州防水公司_厂房屋面外墙防水_地下室卫生间防水堵漏-苏州伊诺尔防水工程有限公司 | 篷房|仓储篷房|铝合金篷房|体育篷房|篷房厂家-华烨建筑科技官网 知名电动蝶阀,电动球阀,气动蝶阀,气动球阀生产厂家|价格透明-【固菲阀门官网】 | 热熔胶网膜|pes热熔网膜价格|eva热熔胶膜|热熔胶膜|tpu热熔胶膜厂家-苏州惠洋胶粘制品有限公司 | 工控机-图像采集卡-PoE网卡-人工智能-工业主板-深圳朗锐智科 | 粘弹体防腐胶带,聚丙烯防腐胶带-全民塑胶 | 标准品网_标准品信息网_【中检计量】 | 数年网路-免费在线工具您的在线工具箱-shuyear.com | 光谱仪_积分球_分布光度计_灯具检测生产厂家_杭州松朗光电【官网】 | 上海小程序开发-上海小程序制作公司-上海网站建设-公众号开发运营-软件外包公司-咏熠科技 | 铸铁平台,大理石平台专业生产厂家_河北-北重机械 | 丽陂特官网_手机信号屏蔽器_Wifi信号干扰器厂家_学校考场工厂会议室屏蔽仪 | 苏州西朗门业-欧盟CE|莱茵UL双认证的快速卷帘门品牌厂家 | 郑州律师咨询-郑州律师事务所_河南锦盾律师事务所 | 洁净实验室工程-成都手术室净化-无尘车间装修-四川华锐净化公司-洁净室专业厂家 | 福建珂朗雅装饰材料有限公司「官方网站」 | 考勤系统_人事考勤管理系统_本地部署BS考勤系统_考勤软件_天时考勤管理专家 | PVC地板|PVC塑胶地板|PVC地板厂家|地板胶|防静电地板-无锡腾方装饰材料有限公司-咨询热线:4008-798-128 | 自动售货机_无人售货机_专业的自动售货机运营商_免费投放售货机-广州富宏主官网 | ph计,实验室ph计,台式ph计,实验室酸度计,台式酸度计 | 液氮罐(生物液氮罐)百科-无锡爱思科 | 上海刑事律师|刑事辩护律师|专业刑事犯罪辩护律师免费咨询-[尤辰荣]金牌上海刑事律师团队 | 山西3A认证|太原AAA信用认证|投标AAA信用证书-山西AAA企业信用评级网 | 山东商品混凝土搅拌楼-环保型搅拌站-拌合站-分体仓-搅拌机厂家-天宇 | 物联网卡_物联网卡购买平台_移动物联网卡办理_移动联通电信流量卡通信模组采购平台? | 管家婆-管家婆软件-管家婆辉煌-管家婆进销存-管家婆工贸ERP | 广州中央空调回收,二手中央空调回收,旧空调回收,制冷设备回收,冷气机组回收公司-广州益夫制冷设备回收公司 | DAIKIN电磁阀-意大利ATOS电磁阀-上海乾拓贸易有限公司 | 液压油缸生产厂家-山东液压站-济南捷兴液压机电设备有限公司 | 上海刑事律师|刑事辩护律师|专业刑事犯罪辩护律师免费咨询-[尤辰荣]金牌上海刑事律师团队 | 乐考网-银行从业_基金从业资格考试_初级/中级会计报名时间_中级经济师 | 河南中专学校|职高|技校招生-河南中职中专网 | 冷却塔风机厂家_静音冷却塔风机_冷却塔电机维修更换维修-广东特菱节能空调设备有限公司 | 武汉高低温试验箱_恒温恒湿试验箱厂家-武汉蓝锐环境科技有限公司 | 金属抛光机-磁悬浮抛光机-磁力研磨机-磁力清洗机 - 苏州冠古科技 |