首頁 後端開發 PHP7 徹底把 PHP7 說透,全面介紹 PHP7 新特性

徹底把 PHP7 說透,全面介紹 PHP7 新特性

May 21, 2019 pm 04:00 PM
php7 新特性

前言

本文是一篇講座聽後+後續研究的總結。 (學習推薦:PHP影片教學

話說當年追時髦,php7一出就給電腦立刻裝上了,php5和php7共存,也是立刻寫了個超級耗時的循環腳本測了一番,確實php7給力很多,然後也是注意了一些新增的特性與一些丟棄掉的用法。

由於php升級乃頭等大事,公司近期才打算升級,所以之前一直只能私下欣賞php7帶來的快感,負責升級的小伙伴搞了個分享,還挺全的,此處mark一下,當作筆記。 (專題推薦:PHP7專題

徹底把 PHP7 說透,全面介紹 PHP7 新特性

主要研究問題: 

1.PHP7帶來的好處 

2.PHP7帶來的新事物 3.PHP7所帶來的廢棄 

4.PHP7所帶來的變更 

#5.如何充分發揮PHP7的效能 

6.如何更好的寫程式來迎接PHP7? 

7.如何升級目前專案程式碼來相容PHP7?

#PHP7帶來的好處

是的,性能上的大幅度提升,可以省機器,可以省錢。 

PHP7帶來的新東西

#1. 類型的宣告。

可以使用字串(string), 整數 (int), 浮點數 (float), 以及布林值 (bool),來宣告函數的參數型別與函數傳回值。

declare(strict_types=1);
function add(int $a, int $b): int {
    return $a+$b;
}

echo add(1, 2);
echo add(1.5, 2.6);

php5是無法執行上面程式碼的,php7執行的時候會先輸出一個3和一個報錯( Argument 1 passed to add() must be of the type integer, float given);

標量類型宣告有兩種模式: 強制(預設) 和嚴格模式。 

declare(strict_types=1),必須放在檔案的第一行執行程式碼,目前檔案有效!

2. set_exception_handler() 不再保證收到的一定是Exception 物件

在PHP 7 中,很多致命錯誤以及可恢復的致命錯誤,都被轉換為異常來處理了。這些異常繼承自 Error 類,此類實作了 Throwable 介面 (所有異常都實作了這個基礎介面)。

PHP7進一步方便開發者處理, 讓開發者對程式的掌控能力更強. 因為在預設情況下, Error會直接導致程式中斷, 而PHP7則提供捕獲並且處理的能力, 讓程式繼續執行下去, 為程式設計師提供更靈活的選擇。

3.新增運算子「<=>」

#語法:$c = $a <=> $b

如果$a > $b, $c 的值為1

如果$a == $b, $c 的值為0

如果$a < $b, $c的值為-1

4.新增運算子「??」

#如果變數存在且值不為NULL, 它就會傳回自身的值,否則返回它的第二個操作數。

//原写法
$username = isset($_GET[&#39;user]) ? $_GET[&#39;user] : &#39;nobody&#39;;

//现在
$username = $_GET[&#39;user&#39;] ?? &#39;nobody&#39;;
5. define() 定義常數數組

define(&#39;ARR&#39;,[&#39;a&#39;,&#39;b&#39;]);
echo ARR[1];// a
6. AST: Abstract Syntax Tree, 抽象語法樹

#AST在PHP編譯過程作為一個中間件的角色, 替換原來直接從解釋器吐出opcode的方式, 讓解釋器(parser)和編譯器(compliler)解耦, 可以減少一些Hack代碼, 同時, 讓實現更容易理解且可維護.

PHP5 : PHP程式碼-> Parser語法解析-> OPCODE -> 執行 

PHP7 : PHP程式碼-> Parser語法解析-> AST -> OPCODE ->執行

參考: https://wiki.php.net/rfc/abstract_syntax_tree##7.匿名函式

$anonymous_func = function(){return &#39;function&#39;;};
echo $anonymous_func(); // 输出function

8. Unicode字元格式支援(echo “\u{9999}”)

9. Unserialize 提供篩選特性

防止非法資料進行程式碼注入,提供了更安全的反序列化資料。

10. 命名空間參考最佳化

// PHP7以前语法的写法 
use FooLibrary\Bar\Baz\ClassA; 
use FooLibrary\Bar\Baz\ClassB; 
// PHP7新语法写法 
use FooLibrary\Bar\Baz\{ ClassA, ClassB};

#PHP7帶來的廢棄

1.廢棄擴充功能

Ereg 正規表示式 

mssql 

mysql 

#sybase_ct


#2.廢棄的特性

不能使用同名的建構子 

實例方法不能用靜態方法的方式呼叫

3.廢棄的函數

###方法呼叫 ######
call_user_method() 
call_user_method_array()
###應該採用call_user_func() 和call_user_func_array()###
加密相关函数
mcrypt_generic_end() 
mcrypt_ecb() 
mcrypt_cbc() 
mcrypt_cfb() 
mcrypt_ofb()
###注意: PHP7.1 mcrypt_*序列函數以後都會移除。建議使用:openssl 序列函數######雜項######
set_magic_quotes_runtime 
set_socket_blocking 
Split 
imagepsbbox() 
imagepsencodefont() 
imagepsextendfont() 
imagepsfreefont() 
imagepsloadfont() 
imagepsslantfont() 
imagepstext()
######4.廢棄的用法#########$HTTP_RAW_POST_DATA 變數被移除, 使用php: //input來代######ini檔案裡面不再支援#開頭的註解, 使用」;”######移除了ASP格式的支援和腳本語法的支援: <% 和< ; script language=php >####

PHP7带来的变更

1.字符串处理机制修改

含有十六进制字符的字符串不再视为数字, 也不再区别对待.

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

2.整型处理机制修改

Int64支持, 统一不同平台下的整型长度, 字符串和文件上传都支持大于2GB. 64位PHP7字符串长度可以超过2^31次方字节.

// 无效的八进制数字(包含大于7的数字)会报编译错误
$i = 0681; // 老版本php会把无效数字忽略。

// 位移负的位置会产生异常
var_dump(1 >> -1);

// 左位移超出位数则返回0
var_dump(1 << 64);// 0 

// 右位移超出会返回0或者-1
var_dump(100 >> 32);// 0 
var_dump(-100 >> 32);// -1

3.参数处理机制修改

不支持重复参数命名

function func(a,b, c,c) {} ;hui报错

func_get_arg()和func_get_args()这两个方法返回参数当前的值, 而不是传入时的值, 当前的值有可能会被修改


所以需要注意,在函数第一行最好就给记录下来,否则后续有修改的话,再读取就不是传进来的初始值了。

function foo($x) {
    $x++;
    echo func_get_arg(0);
}
foo(1); //返回2

4.foreach修改

foreach()循环对数组内部指针不再起作用

$arr = [1,2,3];
foreach ($arr as &$val) {
    echo current($arr);// php7 全返回0
}

按照值进行循环的时候, foreach是对该数组的拷贝操作

$arr = [1,2,3];
foreach ($arr as $val) {
    unset($arr[1]);
}
var_dump($arr);

最新的php7依旧会打印出[1,2,3]。(ps:7.0.0不行)

老的会打印出[1,3]

按照引用进行循环的时候, 对数组的修改会影响循环

$arr = [1];
foreach ($arr as $val) {
    var_dump($val);
    $arr[1]=2;
}

最新的php7依旧会追加新增元素的循环。(ps:7.0.0不行)

5. list修改

不再按照相反的顺序赋值

//$arr将会是[1,2,3]而不是之前的[3,2,1]
list($arr[], $arr[], $arr[]) = [1,2,3];

不再支持字符串拆分功能

// $x = null 并且 $y = null
$str = &#39;xy&#39;;
list($x, $y) = $str;

空的list()赋值不再允许

list() = [123];

list()现在也适用于数组对象

list($a, $b) = (object)new ArrayObject([0, 1]);

6.变量处理机制修改

对变量、属性和方法的间接调用现在将严格遵循从左到右的顺序来解析,而不是之前的混杂着几个特殊案例的情况。 下面这张表说明了这个解析顺序的变化。

徹底把 PHP7 說透,全面介紹 PHP7 新特性引用赋值时自动创建的数组元素或者对象属性顺序和以前不同了

$arr = [];
$arr[&#39;a&#39;] = &$arr[&#39;b&#39;];
$arr[&#39;b&#39;] = 1;
// php7: [&#39;a&#39; => 1, &#39;b&#39; => 1]
// php5: [&#39;b&#39; => 1, &#39;a&#39; => 1]

7.杂项

01.debug_zval_dump() 现在打印 “int” 替代 “long”, 打印 “float” 替代 “double”

02.dirname() 增加了可选的第二个参数, depth, 获取当前目录向上 depth 级父目录的名称。

03.getrusage() 现在支持 Windows.mktime() and gmmktime() 函数不再接受 is_dst 参数。

04.preg_replace() 函数不再支持 “\e” (PREG_REPLACE_EVAL). 应当使用 preg_replace_callback() 替代。

05.setlocale() 函数不再接受 category 传入字符串。 应当使用 LC_* 常量。

06.exec(), system() and passthru() 函数对 NULL 增加了保护.

07.shmop_open() 现在返回一个资源而非一个int, 这个资源可以传给shmop_size(), shmop_write(), shmop_read(), shmop_close() 和 shmop_delete().

08.为了避免内存泄露,xml_set_object() 现在在执行结束时需要手动清除 $parse。

09.curl_setopt 设置项CURLOPT_SAFE_UPLOAD变更

TRUE 禁用 @ 前缀在 CURLOPT_POSTFIELDS 中发送文件。 意味着 @ 可以在字段中安全得使用了。 可使用 CURLFile作为上传的代替。 

PHP 5.5.0 中添加,默认值 FALSE。 PHP 5.6.0 改默认值为 TRUE。. PHP 7 删除了此选项, 必须使用 CURLFile interface 来上传文件。

如何充分发挥PHP7的性能

1.开启Opcache

zend_extension=opcache.so 

opcache.enable=1 

opcache.enable_cli=1

2.使用GCC 4.8以上进行编译

只有GCC 4.8以上PHP才会开启Global Register for opline and execute_data支持, 这个会带来5%左右的性能提升(Wordpres的QPS角度衡量)

3.开启HugePage (根据系统内存决定)

徹底把 PHP7 說透,全面介紹 PHP7 新特性

4.PGO (Profile Guided Optimization)

第一次编译成功后,用项目代码去训练PHP,会产生一些profile信息,最后根据这些信息第二次gcc编译PHP就可以得到量身定做的PHP7

需要选择在你要优化的场景中: 访问量最大的, 耗时最多的, 资源消耗最重的一个页面.

参考: http://www.laruence.com/2015/06/19/3063.html 

参考: http://www.laruence.com/2015/12/04/3086.html

如何更好的写代码来迎接PHP7?

1. 不使用php7废弃的方法,扩展

2. 使用2个版本都兼容的语法特性【 list ,foreach, func_get_arg 等】

如何升级当前项目代码来兼容PHP7?

逐步剔除php7不支持的代码

检测工具:https://github.com/sstalle/php7cc

徹底把 PHP7 說透,全面介紹 PHP7 新特性

更多资料

#

以上是徹底把 PHP7 說透,全面介紹 PHP7 新特性的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

Rimworld Odyssey如何釣魚
1 個月前 By Jack chen
Kimi K2:最強大的開源代理模型
1 個月前 By Jack chen
我可以有兩個支付帳戶嗎?
1 個月前 By 下次还敢

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1602
29
PHP教程
1506
276
php7.0安裝了插件還是顯示未安裝怎麼辦 php7.0安裝了插件還是顯示未安裝怎麼辦 Apr 02, 2024 pm 07:39 PM

解決 PHP 7.0 中插件未顯示已安裝問題的方法:檢查插件配置並啟用插件。重新啟動 PHP 以套用配置變更。檢查插件檔案權限,確保其正確。安裝遺失的依賴項,以確保插件正常運作。如果其他步驟都失敗,則重建 PHP。其他可能原因包括外掛程式版本不相容、載入錯誤版本或 PHP 配置問題。

PHP 伺服器環境常見問題指南:快速解決常見難題 PHP 伺服器環境常見問題指南:快速解決常見難題 Apr 09, 2024 pm 01:33 PM

PHP伺服器環境常見的解決方法包括:確保已安裝正確的PHP版本和已複製相關檔案到模組目錄。暫時或永久停用SELinux。檢查並配置PHP.ini,確保已新增必要的擴充功能和進行正確設定。啟動或重新啟動PHP-FPM服務。檢查DNS設定是否有解析問題。

在Docker環境中使用PECL安裝擴展時為什麼會報錯?如何解決? 在Docker環境中使用PECL安裝擴展時為什麼會報錯?如何解決? Apr 01, 2025 pm 03:06 PM

在Docker環境中使用PECL安裝擴展時報錯的原因及解決方法在使用Docker環境時,我們常常會遇到一些令人頭疼的問�...

php8有什麼新特性 php8有什麼新特性 Sep 25, 2023 pm 01:34 PM

php8新特性有JIT 編譯器、型別推導、命名參數、聯合型別、屬性、錯誤處理改進、非同步程式支援、新的標準函式庫函數和匿名類的擴充等。詳細介紹:1、JIT編譯器,PHP8引入了JIT編譯器,這是一個重要的效能改進,JIT編譯器可以對一些高頻執行的程式碼進行即時編譯和最佳化,從而提高運行速度;2、類型推導,PHP8引入了類型推導功能,允許開發者在宣告變數時自動推導出變數的類型等等。

學習PHP8的新特性,深入理解最新技術的指南 學習PHP8的新特性,深入理解最新技術的指南 Dec 23, 2023 pm 01:16 PM

深入解析PHP8的新特性,幫助您掌握最新技術隨著時間的推移,PHP程式語言一直在不斷演進和改進。最近發布的PHP8版本為開發者提供了許多令人興奮的新功能和改進,為我們的開發工作帶來了更多便利和效率。在本文中,我們將深入解析PHP8的新特性,並提供具體的程式碼範例,旨在幫助您更好地掌握這些最新的技術。 JIT編譯器PHP8引進了JIT(Just-In-Time)編

PHP 8.3發布:新功能一覽 PHP 8.3發布:新功能一覽 Nov 27, 2023 pm 12:52 PM

PHP8.3發布:新功能一覽隨著技術的不斷發展和需求的不斷變化,程式語言也不斷更新和改進。作為一種廣泛應用於網頁開發的腳本語言,PHP一直在不斷進步,為開發者提供更強大和高效的工具。最近發布的PHP8.3版本帶來了許多期待已久的新功能和改進,以下讓我們來看看這些新特性的一覽。非空屬性的初始化在過去的PHP版本中,如果一個類別的屬性沒有明確賦值,它的值

如何在系統重啟後自動設置unixsocket的權限? 如何在系統重啟後自動設置unixsocket的權限? Mar 31, 2025 pm 11:54 PM

如何在系統重啟後自動設置unixsocket的權限每次系統重啟後,我們都需要執行以下命令來修改unixsocket的權限:sudo...

記錄一次用strace診斷php佔用系統資源過高的問題 記錄一次用strace診斷php佔用系統資源過高的問題 May 03, 2024 pm 04:31 PM

本機環境:redhat6.7系統。 nginx1.12.1,php7.1.0,程式碼使用yii2框架問題:本地的web站需要用到elasticsearch服務。當php使用本機伺服器搭建的elasticsearch時,本地的負載都是正常。當我使用aws的elasticsearchservice服務時,本地伺服器出現負載經常過高的情況。查看nginx和php日誌,發現沒有異常。系統的並發連線數也不高。這時候想到我們老闆跟我講的一個strace診斷工具。偵錯過程:找一個php的子程序idstrace-

See all articles