爲什麼我們青睞 PHP?

雲棲號資訊:【點擊查看更多行業資訊
在這裏您可以找到不同行業的第一手的上雲資訊,還在等什麼,快來!

在 Hologram ,我們後端服務的搭建主要使用了兩種編程語言:PHP 和 Python。 其中,PHP 組件最接近用戶層,它提供了所有服務的 REST API 接口。

有人曾向我們提出疑問:大家都在唱衰 PHP,認爲它“不僅笨重而且過時”,爲什麼你們還會重度使用 PHP?在我看來,PHP 得到這樣評價的原因有兩個:

1.人們早在 2005 年就開始使用它,當時它是一門非常年輕的語言,缺少很多真正有用或通用的功能特性,例如缺少對面向對象的特性支持。
2.爲保持較好的兼容性,許多流行的應用程序(比如 Wordpress),它們並沒有充分利用該語言的很多新功能特性,即使 PHP 的很多新功能特性發布很久了,開發人員仍然堅持使用老版本的 PHP。

雖然上述問題客觀存在,但是我仍然想爲 PHP 辯護一下——PHP 仍然是一門非常有用的編程語言,並且非常適合我們的需求。
我們都已經知道 PHP 具有一些不錯的內置 Web 服務功能,例如可以獲取 HTTP Header 信息、完整的 session cookie 支持等。但是,可能很多人不知道,PHP 在編程語言界仍佔有一席之位,這與它的一些其他功能特性有關。接下來,我要闡述 PHP 的一些優點。

面向對象!

PHP 的早些版本不支持類對象,因此,代碼很容易變得混亂起來。沒有面向對象,我們就需要寫一大串的 include 來引用需要的一些方法函數,並且還必須不斷地將大量的參數變量傳遞給名稱很長的函數。

現在,你無需有上面這種擔心。如今的 PHP 具有強大的面向對象支持,包括類、構造函數、析構函數、命名空間和繼承等所有必須的功能。
除此之外,PHP 具備一些特有的強大功能。

自動加載器

PHP 有一個非常有用的功能特性,如果某個類尚未加載,它可以自動加載該類的文件。這意味着在所有文件的頭部可以不再包含 include / require 語句塊。如果你要使用一個類對象,那麼它已經被自動加載了。

就其本身而言,這已經非常好了,但是更高級的使用場景是,在你的應用程序中可以完全自定義特定的自動加載邏輯,並且能將多個自動加載器鏈接在一起。這意味着你所有的第三方庫也將會被自動加載。

在你的代碼中,只需創建類或調用它們的方法,那麼一切都會爲你自動加載。你無需通過編寫代碼加載或者像其他語言一樣使用路徑來加載特定內容。在測試代碼之外的整個 Hologram 代碼庫中,我們可能僅有兩次調用了include()或require()。
剛剛提到了第三方庫,下面就說一下依賴管理。

依賴管理

PHP 的軟件包管理系統不輸於其他的編程語言。我們在 Hologram 上使用的是 Composer,這是最受歡迎的一個依賴管理工具。它使用起來非常簡單,只需將配置參數保存在 JSON 文件中就可以了。你可以爲每個軟件包指定要使用的版本範圍,並且它會生成一個鎖定文件,將該鎖定文件共享到代碼庫中,就能確保所有開發者使用的第三方依賴版本完全相同。
將新的依賴包添加到 JSON 文件中並進行安裝,操作起來非常簡單,只需要在終端執行以下命令:

composer install somepackage

流行框架

如今,PHP 擁有一個強大的開發者社區,因此不僅有大量的工具庫可供使用,而且擁有很多完整的框架可幫助簡化應用程序的構建。在 Hologram 中,我們使用了 Slim 框架,該框架可以非常方便的定義 API 路由,還具有其他有用的功能,比如可以非常方便的添加用於身份驗證以及速率限制的中間件等。

其他流行的框架還有 Laravel、Symfony 等。

PDO 數據庫接口

在我用過的所有編程語言中,PHP 擁有最好用的數據庫集成接口,而 PDO 是所有數據庫接口的基礎。PDO 的全稱是 PHP Database Objects,它是執行 SQL 查詢的首選方式。

它包括用於查詢以及對結果分頁的所有常用功能。還可以按“行”將數據存儲到 PHP 關聯數組,這意味着所有“列”數據在數組裏存在着鍵值,且支持通過鍵值訪問數組數據。

最棒的就是它支持參數化查詢並可以防止 sql 注入。這意味着你可以執行以下操作:

// define $database as a PDO object
$stmt = $database->prepare("SELECT * FROM users WHERE id = ?;");
$result = $stmt->execute([$idnumber]);
$rows = $result->fetchAll();

PDO 會自動將“?”替換爲 $idnumber 中的值,進行正確地轉義以防止 SQL 注入攻擊。
你還可以做一些更酷的事情,例如,它還支持綁定命名參數:

// define $database as a PDO object
$values = ['id' => 10, 'email' => '[email protected]'];
$stmt = $database->prepare('SELECT * FROM users WHERE id = :id AND email = :email;');
$result = $stmt->execute($values);
$rows = $result->fetchAll();

在這種情況下,PDO 會在參數化查詢的同時進行正確的參數替換。

無論什麼類型的數據庫引擎,PDO 都會對外公開相同的接口。當然,數據庫引擎之間偶爾也會有 SQL 語句的差異,但是大多數情況下,你只需在初次連接數據庫時指定好數據庫的類型,然後就可以調用一套函數方法對所有數據庫進行相同的操作。

Phinx 數據庫遷移工具

說到數據庫,我必須推薦一個非常好用的第三方庫——Phinx。我們可以通過該工具來完成所有的數據庫遷移工作。每當我們需要進行數據庫模式變更時,可以使用 Phinx 在數據庫上進行數據遷移操作。遷移過程如下所示:

$orders = $this->table('orders');
$orders->addColumn('invoice_text', 'string', ['length'=>256, 'default'=>''])
    ->update();

你可以去 Phinx 官網查看詳細的使用文檔。

內置函數庫

最後一個使 PHP 變得更便捷、好用的是它擁有出色的內置工具函數庫。
假設你有一個來自數據庫的結果集,該結果集是一個以行數組爲元素的數組。假設你要從每個數組元素中提取 name 列。當然,我們可以使用 PHP 支持的 map 函數來執行此操作,但是還有更簡單的方式執行此操作:

$names = array_column($rows, 'name');

就這麼簡單,而且上面的方法運行速度非常快,因爲 PHP 內核直接調用運行的 C 接口。

此外,還有很多類似的內置函數,從數組操作到解析 XML 到處理上傳的文件,你都可以從 PHP 官方文檔中查到具體的使用方法。

我列舉一下自己常用的一些 PHP 內置函數:
array_chunk —— 對數組進行截取操作
array_unique —— 移除數組中的重複元素
DateTime —— 用於處理日期的方法,還可以解析簡單的英語日期描述,例如“midnight first day of next month”
fpassthru —— 讀取文件內容,並輸出結果給用戶。
str_getcsv —— 解析 CSV 格式字段的字符串,並返回一個包含所讀取字段的數組。
urlencode —— 對字符串進行 URL 編碼

不要忘記一些有用的符號運算符,例如?? ,它可以讓你在對數組指定默認值的同時檢查數組中索引是否存在。

$a = $some_array[$x] ?? 500;

結論

大家可以考慮將 PHP 用於自己的項目!它比你想像中的要好很多。

【雲棲號在線課堂】每天都有產品技術專家分享!
課程地址:https://yqh.aliyun.com/zhibo

立即加入社羣,與專家面對面,及時瞭解課程最新動態!
【雲棲號在線課堂 社羣】https://c.tb.cn/F3.Z8gvnK

原文發佈時間:2020-07-29
本文作者:REUBEN BALIK
本文來自:“InfoQ”,瞭解相關信息可以關注“InfoQ

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章