php7新特性
1. php7的五大新特性有哪些 PHP7的五大新特性有哪些一覽
1、PHP 7 除了在性能方面有極謹納大提升外,還添加了很多新的特性,如太空船操作符、標量類型聲明、返回值的類型說明、全局的 throwable 介面、猜基抽象語法樹等。
2、在使用 PHP 7之前,我們在函數和類之間傳遞參數時不必聲明變數類型。同樣地,在返回數據時也不必聲明變數類型。同樣地,在返回數據時也不必聲明變數類型。任何數據類型都可以被傳遞、返回。這樣便給 PHP 帶來了一個很大的問題——PHP 不清楚你傳遞的是什麼類型的變數,函數、方法接收到的變數也不知道是什麼類型。為了解決這個問題,PHP 7引入了類型聲明,目前明確的有兩類變數可以聲明類型:形參、返回值。
3、PHP 7 支持的形參類型聲明的類型有:字元串(string)、整型(int)、浮點型(float)以及布爾型(bool)。
注意參數類型聲明不受制於默認模式和嚴格模式。默認模式下,當傳入的參數不符合聲明類型時,會首先嘗試轉換類型;而嚴格模式下,則直接報錯。
4、PHP 7.1對函數返回值的聲明做了擴充,可以定義其返回值祥兆沒為void,無論是否開啟嚴格模式,只要函數中只能有「return;」,其他以外的其他return語句都會報錯。
5、PHP 7.1.0對參數類型和返回值還有進一步的支持,其類型可以是可空類型,在參數或返回值類型聲明前面加上「?」,表示返回值要麼是null,要麼是聲明的類型
2. Php7有哪些新特性
PHP 7.4 的主要特性包括以下幾個,
短閉包函數(short closure) 預載入提交性能 屬性類型限定 Improved type variance(不會翻譯) 三元運算簡寫 數組展開運算 新增類的魔術方法:serialization 數字分隔符 運算優先順序 允許在__toString中拋出異常 支持反射引用 新增位元組分割函數 移除php短標簽 棄用左關聯運算符 不再向後兼容的變更 短閉包函數短閉包函數可以減少冗餘代碼:
array_map(function (User $user) { return $user->id; }, $users) array_map(fn(User $user) => $user->id, $users)需要注意幾點:
短閉包可以直接訪問閉包函數外面的變數,所以不需要再寫?use?關鍵詞 以fn關鍵詞開始 $this?可以像普通的閉包一樣使用 短閉包只有一行代碼,僅僅做返回聲明使用,不允許使用return?關鍵詞還可以使用更嚴格類型的方式
$ids = array_map(fn(User $user): int => $user->id, $user); 預載入PHP預載入可以極大的提高性能
優點:在PHP 7.4以前,如果你使用了框架來開發,每次請求文件就必須載入和重新編譯。預載入在框架啟動時在內存中載入文件,而且在後續請求中永久有效。
缺點:性能的提升會在其他方面花費很大的代價,每次預載入的文件發生改變時,框架需要重新啟動。
屬性類型限定 class A { public string $name; public Foo $foo; }不得不說,PHP越來越接近Java等強類型語言
Improved type variance協變返回類型:
class ParentType {} class ChildType extends ParentType {} class A { public function covariantReturnTypes(): ParentType { /* … */ } } class B extends A { public function covariantReturnTypes(): ChildType { /* … */ } }依賴(是不是很熟悉):
class ParentType {} class ChildType extends ParentType {} class A { public function covariantReturnTypes(): ParentType { /* … */ } } class B extends A { public function covariantReturnTypes(): ChildType { /* … */ } } 簡寫三元運算符在目前> PHP 7以後的寫法:
$data['date'] = $data['date'] ?? new DateTime(); 在PHP 7.4你可以這樣寫: $data['date'] ??= new DateTime(); 數組展開運算合並數組到另一個數組中,返回一維數組
$arrayA = [1, 2, 3]; $arrayB = [4, 5]; $result = [0, ...$arrayA, ...$arrayB, 6 ,7]; // [0, 1, 2, 3, 4, 5, 6, 7]注意? :只對數字索引有效
新增類的魔術方法RFC添加了兩個新的魔術方法__serialize和__unserialize
數字分隔符允許使用下劃線更直觀的分隔數值
$unformattedNumber = 107925284.88; $formattedNumber = 107_925_284.88; 運算優先順序PHP 7.4之前,如果你這樣寫:
echo "sum: " . $a + $b; PHP會解析為: echo ("sum: " . $a) + $b; PHP 8將會解析為: echo "sum :" . ($a + $b); __toString中拋出異常支持反射引用PHP 7.4將會新增ReflectionReference?類
移除php短標簽<?將會在PHP 8中移除,<?=會繼續保留
棄用左關聯運算符PHP遺留了一些奇怪的怪癖,比如
1 ? 2 : 3 ? 4 : 5; // 將會在 PHP 7.4 中廢棄,在 PHP 8中會拋出編譯錯誤 (1 ? 2 : 3) ? 4 : 5; // 正確 不再向後兼容的變更 棄用在沒有父類的情況下調用parent:: 調用var_mp列印DateTime和DateTimeImmutableshi』實例,將不再保留對象上的可訪問屬性 openssl_random_pseudo_bytes?會在調用錯誤時拋出異常 序列化PDO和PDOStatement?實例將會生成一個Exception而不是PDOException異常 調用get_object_vars()列印ArrayObject?實例將會返回ArrayObject?自己的屬性,而不是被包裹的數組或對象的值,數組強制轉換不受影響
3. PHP語言的八大優勢
PHP(Hypertext),超文本預處理器,是一種通用性開源腳本語言。它的語法吸取了C語言、Java和Perl的優點,免費、快捷、高效,主要適用於Web開發領域。
目前,全球5000萬互聯網網站60%以上都在使用PHP技術,AlexaTOP500中國網站排名中有394家使用PHP,國內80%以上動態網站使用PHP進行開發,在Web後端語言中PHP全球市場語言佔有率達到80%。
像Facebook、Google、新浪、網路、YouTube、騰訊都在使用PHP。
PHP語言的八大優勢:
1、開放源代碼,所有的PHP源代碼事實上都可以得到。
2、免費性,php和其它技術相比,PHP本身免費且是開源代碼。
3、快捷性,程序開發快,運行快,技術本身學習快。嵌入於HTML:因為PHP可以被嵌入於HTML語言,它相對於其他語悉腔答言。編輯簡單,實用性強,更適合初學者。
4、跨平台性強,由於PHP是運行在伺服器端的腳本,可以運行在UNIX、LINUX、WINDOWS、MacOS下。
5、專業專注,PHP支持腳本語言為主,同為類C語言。
6、效率高PHP消耗相當少的系統資源。
7、面向對象,在php4,php5中,面向對象方面都有了很大的改進,php完全可以用來開發大型商業程序。睜慧
8、圖像處理,用PHP動態創建圖像,PHP圖像處理默認使用GD2。且也可以配置為使用magick進行圖像處理。
PHP的3種常用運行方式:CGI、FastCGI、。
1、CGI
CGI即通用網關介面(commongatewaginterface),它是一段程序,通俗的講CGI就像是一座橋,把網頁和WEB伺服器中的執行程序連接起來,它把HTML接收的指令傳遞給伺服器的執行程序,再把伺服器執行程序的結果返還給HTML頁。CGI的跨平台性能極佳,幾乎可以在任何操作系統上實現。
2、FastCGI
fast-cgi是cgi的升級版本,FastCGI像是一個常駐(long-live)型的CGI,它可以一直執行著,只要激活後,不會每次都要花費時間去fork一次。PHP使用PHP-FPM(FastCGIProcessManager),全稱PHPFastCGI進程管理器進行管理。
但每一個Web請求PHP都必須重新解析php.ini、重新載入全部擴展並重初始化全部數據結構。使用FastCGI,所有這些都只在進程啟動時發生一次。一個額外的好處是,持續資料庫連接(Persistentdatabaseconnection)可以工作。
3、
PHP作為Apache模塊,Apache伺服器在系統啟動後,預先生成多個進程副本駐留在內存中,一旦有請求出現,就立即使用這些空餘的子進程進行處理,這樣就不存在生成子進程造成的延遲了。這些伺服器副本在處理完一次HTTP請求之後並不立即退出,而是停留在計算機中等待下次請求。對於客戶瀏覽器的請求反應更快,性能較高。
如何保護自己的PHP代碼:
1、代碼混淆加密
就是把代碼base64加密,然後對base64里的字元串進行字元串映射(隨機生成字典混淆)然後eval執行這種百分之百能被破解還原。
2、混淆亂碼字元
代碼混淆變數還有一些東西和1原理差不多,不過是把字元串換到ascii127到255之間非人類還有編輯器看不懂的字元,結果也是百分之百能被破解和還原,只是時間問題。
3、發放opcode
不分發代碼,而是先把PHP代碼預編譯,分發opcode,PHP7以後opcache深度集成這個東西PHP7以後可以用這個方法保護源碼,但是也會被opcode反編譯回去也會被破解。
4、混淆加密寫PHP擴展
混淆加密寫PHP擴展,但是只要是開源的PHP擴展都會被破解,除非自己寫加密演算法,把PHP代碼加密,然後自己拿C語音寫擴圓談展閉源,別人不知道你加密思路和破解思路,被破解的可能性很小。
4. PHP之父:PHP的未來會怎樣
您是否擔心自己的PHP程序員生涯?或者仍然困惑,PHP是否是更好的語言來啟動你的編程生涯。在本文中,我們將通過討論PHP的空間和未來,來解決您的問題和困惑。
PHP真的不行了嗎?
很多人建議說PHP在未來5年已經沒有發展空間了。大公司更傾向於使用Java, .Net, Python, C, C++等語言來構建web應用。
我們必須記住這一點:任何編程語言都不能完全按照程序員的期望去做,每個語言都有自己的優點和缺點。
為了和其他語言做比較,我們對PHP的優缺點進行了分類,最後得出了我們的結論。
PHP的缺點
PHP不原生支持多線程,因為它是服務端的腳本語言,會由web伺服器替代解決多線程的問題。
PHP是弱類型語言,有可能存在安全隱患。
PHP還有其他安全隱患,例如:SQL注入,Session攻擊,代碼泄露等。
PHP社區延遲發布其新版本。
大多數開發人員說,PHP不是一種好的選擇,因為高級和復雜Web應用程序的編程語言具有安全特性,且具有復雜的文件結構和目錄管理系統。
聽PHP之父怎麼說:
視頻載入中...
PHP的優點
PHP是最流行的開源編程語言,有更豐富的工具可供開發,且成本更低。這就是為什麼PHP在網路自由職業者中流行的原因。
PHP的最新版本PHP 7推出更多的增強功能和更高的性能。
提供最強的和最易用的CMS像WordPress,Drupal,Magento,Open Cart,Joomla等,可以幫助用戶很快建立一個網站。
PHP框架如CodeIgniter、Laravel等,強製程序員使用MVC(模型-視圖-控制器)設計模式創建Web應用程序。這是個好習慣。
網路上PHP的內容更多,支持的網站也更多。
PHP語法很容易學。
PHP7相比PHP5.6性能提升很多。
PHP7能帶給我們什麼?
以下是PHP7提供的一些增強功能:
數據類型聲明
函數返回值類型聲明
匿名類
新操作符
使用PHP的TOP 5 網站:
Yahoo
Wikipedia
WordPress.com
Flickr
結論
現在,在PHP社區和開發人員的支持下,超過83%的站點使用了PHP技術。
PHP7實現了更多的安全特性,性能比舊版本更好。由於開源和廉價的伺服器託管,PHP是性價比最高的語言。PHP CMS使開發者更容易建立基於Web的應用程序,並且PHP框架使你更合理,有效的開發應用。
所以綜合所有的優點和缺點,PHP都是非常值得選擇的。
5. php7 & php8 知識點大略
php7 速度快的原因
zval定義改變
之前char int用的結構體,現在統一用聯合體行毀梁定義。擴充欄位也是聯合體
zval能保存的數據不再引用,比如bool、int,直接賦值,不需要引用計數了
hashtable結構修改
zend_array,Bucket結構更簡單,內存佔用更少。去掉了為了解決hash沖突,的2個雙向鏈表。直接用連續的數組。
zend_string結構修改 從兩個結構體,換成了一個結構體。存儲數據使用柔性數組代替了指針。
函數服用機制
內置函數
php7新特性
增加類型聲明
??雙問號合並運算
<=> 船運算符 返回 -1 0 11
常量數組
define('sites', [
'Google',
'Runoob',
'Taobao'
]);
可以定義匿名類
反序列化過濾unserialize
隨機數random_bytes random_int
use 可以批量導入
php8
方法參數可以跳過
可以用#注釋
類的初始化屬性可以不用定義
類型聲明可以多種
代替switch的match表達式
運算符鏈式調用。不用多個if
0 == 'foobar' 是false
jit
Opcache直接生成機器碼提高性能。
Opcache會做opcode層面的優化,比如圖中的倆條opcode合並為一條
PHP8的JIT目前檔運是在Opcache之中提供的
JIT在Opcache優化之後的基礎上,結余純合Runtime的信息再次優化,直接生成機器碼
JIT不是原來Opcache優化的替代,是增強
目前PHP8隻支持x86架構的CPU