通過PHP-CPP開始PHP擴展開發
>
- >擴展PHP功能以進行一些非常特殊的用法(數學,統計,幾何等)。
- 與純PHP實施相比, 具有更高的性能和效率
- 利用以前掌握的語言(對我,C)獲得的編程獲得的迅速性。
- >
- 使用更多的PRHP語義,例如Zephir。
- >使用更多的Pro-C/C語義,例如PHP-CPP,將在本文中解決。
- 對我來說,選擇第二種方法的主要驅動器很簡單:我開始使用C/C進行編程愛好,因此我仍然更願意在C/C中編寫那些較低級別的模塊。 PHP-CPP的官方網站給出了其他一些理由。
鑰匙要點
PHP-CPP是一個用於開發PHP擴展的庫,允許C開發人員編寫PHP擴展,而無需直接與Zend API合作的複雜性。它寫在C 11中,並提供了有據可查和用戶友好的課程的集合。
> PHP-CPP正在迅速發展,建議使用Git克隆存儲庫以進行最新更新。它支持單線讀取的PHP安裝,並需要升級到G編譯器到4.8.x版或更高版本以兼容。- >
- > PHP-CPP提供了一個骨架擴展項目,其中包括一個main.cpp文件,用於編譯擴展名的製造文件以及用於擴展加載的.INI文件。可以定制骨架項目以適合個人需求,並使用“ make && sudo make install”命令進行編譯和安裝。 PHP-CPP支持四種類型的函數簽名,可以從PHP調用,並允許參數以數組形式通過值傳遞。它還允許功能導出/註冊,功能參數類型的規範以及以對象為導向的擴展的創建。
- >安裝和配置
- PHP-CPP正在迅速發展。在本文撰寫本文時,它以0.9.1版本(大約2天發布)。根據其文檔:“這是一個為即將推出的V1.0版本做準備的功能凍結版本”,因此我們有信心很快就會看到其1.0主要版本。 因此,至少在此期間,建議使用git克隆存儲庫,並通過git拉動獲得最新更新。
注意:安裝上的PHP-CPP文檔指出,暫時,它“僅支持單線讀取PHP安裝”,因為“內部Zend Engine使用了非常奇怪的系統來確保線程安全性”。未來的發行版可能支持多線Readed PHP安裝,但讓我們暫時記住這一點,並遵守其當前限制。幸運的是,大多數PHP安裝都應該是“單線讀取的PHP安裝”。
>> php-cpp寫在C 11中。因此,我的Ubuntu 12.04 LTS中安裝的G較舊版本不支持它。我們需要將G編譯器升級到上述4.8.x版本。有一篇文章詳細介紹了進行升級的步驟。請按照列出的說明進行操作。
>另外,PHP-CPP彙編將使用php.h標頭文件。除非安裝PHP-DEV,否則通常在Ubuntu框中缺少此文件。我們可以通過發出此命令來安裝與PHP5相關的開發文件:
<span>sudo apt-get install php5-dev</span>
>升級G並安裝必要的標頭文件後,我們可以發布以下命令以編譯和安裝PHP-CPP庫文件(libphpcpp.so):
<span>make && sudo make install</span>
>。 PHP-CPP LIB的安裝現已完成。這非常簡單,我們現在可以繼續進行編程部分。
在這樣做之前,我們將討論PHP-CPP中使用的一些重要概念和術語。完整的文檔可以在其官方網站上找到,並鼓勵每個人在執行任何真正的編程之前閱讀它。骨架(空)擴展項目文件
PHP-CPP提供了一個骨架擴展項目,其中包含以下3個文件:
> main.cpp:包含get_module函數的主CPP文件(稍後將詳細討論)
>makefile:示例製作文件以編譯擴展名
- yourextension.ini:僅包含一行擴展名加載
- > makefile
- >如果您熟悉 *NIX開發,那麼您熟悉此Makefile。應進行一些輕微的更改以自定義此文件以滿足我們的需求:
更改名稱=您對更有意義的extension,例如名稱=骨架。
>更改ini_dir = /etc/php5/conf.d匹配系統的配置。就我而言,它是ini_dir = /etc/php5/cli/conf.d。我修改了INI路徑,以首先啟用PHP CLI環境的擴展。
- 這些都是我所做的所有更改。其餘的makefile可以保持原樣。
- > yourextension.ini
>
<span>sudo apt-get install php5-dev</span>
> main.cpp
在PHP-CPP提供的空項目中,此文件僅包含一個函數:get_module(),該函數下面摘錄:
<span>make && sudo make install</span>
>目前,讓我們更改此行以匹配我們打算創建的擴展名:
接下來,我們需要將所需的文件複製到適當的文件夾中:
<span><span>#include <phpcpp.h></span> </span> <span>/** </span><span> * tell the compiler that the get_module is a pure C function </span><span> */ </span><span>extern "C" { </span> <span>/** </span><span> * Function that is called by PHP right after the PHP process </span><span> * has started, and that returns an address of an internal PHP </span><span> * strucure with all the details and features of your extension </span><span> * </span><span> * @return void* a pointer to an address that is understood by PHP </span><span> */ </span> PHPCPP_EXPORT <span>void *get_module() </span> <span>{ </span> <span>// static(!) Php::Extension object that should stay in memory </span> <span>// for the entire duration of the process (that's why it's static) </span> <span>static Php::Extension extension("yourextension", "1.0"); </span> <span>// @todo add your own functions, classes, namespaces to the extension </span> <span>// return the extension </span> <span>return extension; </span> <span>} </span><span>} </span>
然後,我們可以通過PHP -I |將擴展名驗證在CLI中加載。 GREP骨架,終端應顯示類似的東西:
><span>static Php::Extension extension("skeleton", "1.0"); // To be humble, we can change the version number to 0.0.1</span>
(回想一下skeleton.ini是我們修改的文件,其中包含擴展名= skeleton.so line。)
> 到目前為止,我們已經使用PHP-CPP進行了編譯並安裝了我們的第一個PHP擴展。當然,此擴展程序還沒有任何作用。現在,我們將創建第一個功能,以進一步了解建立PHP擴展的過程。
“你好,泰勒”功能
>
>根據“註冊本機函數”上的PHP-CPP文檔,它支持四種類型的功能簽名:
在這種情況下,我使用第二個簽名,並且參數以數組形式(PHP功能)按值傳遞。但是,在Helloworld中,我們專門使用了C型STD :: String來獲取第一個參數。 我們還使用C STD LIB來輸出一個熱情的消息。
在get_module()函數中,在聲明擴展變量後,我們添加了要導出的函數(helloworld()),並為php腳本(helloworld)分配一個名稱。現在,讓我們編譯並安裝擴展程序。如果一切順利進行,新的骨架將復製到擴展名目錄。
<span>make && sudo make install</span>
我們可以編寫一個簡單的腳本來測試剛剛創建的函數:
<span>cp -f skeleton.so /usr/lib/php5/20121212 </span><span>cp -f skeleton.ini /etc/php5/cli/conf.d</span>
>我們將回到以後觀察到的內容。
>函數參數通過參考
接下來,我們將看到另一個函數,該函數通過引用,swap()函數傳遞參數。在此功能中,我們還將嘗試指定參數及其類型的數量。在main.cpp中,我們添加了另一個函數swap():
>
<span>sudo apt-get install php5-dev</span>
我們明確地說:
<span>make && sudo make install</span>
將有兩個參數(a和b);
- >
- 應通過引用(而不是通過值);
>通過 它們應該是數字類型的。 - >讓我們編譯並再次安裝更新的擴展程序,並編寫一些代碼片段,以查看此新功能的工作方式:
>
>
>第一個呼叫(交換($ a,$ b))顯示了預期的結果:20 | 10。該函數交換了兩個數字。<span>extension=skeleton.so</span>
第二個通話是出乎意料的:我們告訴PHP我們要交換兩個數字!但是它只是忽略了第二個參數傳遞的是字符串,並且無論如何都進行交換!
好吧,從某種意義上說,仍然可以預期。 PHP並沒有真正區分數字類型和字符串類型。這種行為符合PHP標準。同樣,由於這種行為,我們沒有,也不能使用C內部類型作為功能(TEMP)中使用的臨時變量,而是使用PHP ::值作為變量類型。第三個通話將起作用。第一個var_dump將顯示DateTime對象,第二個將顯示整數。這是某種程度上出乎意料的(至少對我來說)。畢竟,對象與數字/字符串完全不同。但是,在考慮到這種“互換”行為在PHP中也可行之後,它與PHP的奇怪之處相符。
>那麼,這是否意味著“類型”規範不會產生任何影響?並不真地。為了進一步闡述這一點,我們創建了第三個功能:
我們這樣註冊了此功能:
測試代碼將是這樣的:
><span><span>#include <phpcpp.h></span> </span> <span>/** </span><span> * tell the compiler that the get_module is a pure C function </span><span> */ </span><span>extern "C" { </span> <span>/** </span><span> * Function that is called by PHP right after the PHP process </span><span> * has started, and that returns an address of an internal PHP </span><span> * strucure with all the details and features of your extension </span><span> * </span><span> * @return void* a pointer to an address that is understood by PHP </span><span> */ </span> PHPCPP_EXPORT <span>void *get_module() </span> <span>{ </span> <span>// static(!) Php::Extension object that should stay in memory </span> <span>// for the entire duration of the process (that's why it's static) </span> <span>static Php::Extension extension("yourextension", "1.0"); </span> <span>// @todo add your own functions, classes, namespaces to the extension </span> <span>// return the extension </span> <span>return extension; </span> <span>} </span><span>} </span>
>當我們通過正確的類類型(SampleClass)傳遞時,對SwapoBject()的第一個調用將起作用。第二個將失敗,顯示“可捕獲的致命錯誤:參數1傳遞給swapobject()必須是SampleClass的實例,是給定的另一個類別的實例...”。
<span>static Php::Extension extension("skeleton", "1.0"); // To be humble, we can change the version number to 0.0.1</span>
結論
在本文中,我們說明了準備PHP-CPP為我們的PHP環境工作的步驟。我們還討論了使用PHP-CPP(和C語義)創建PHP擴展的一些基本步驟。>我們介紹了擴展項目文件,功能簽名,功能導出/註冊和功能參數類型。
>在下一篇文章中,我們將進一步詳細介紹PHP-CPP中的一些關鍵功能,並提供現實世界中的用例,展示了使用php-cpp的C類和名稱空間實現的使用。
>
>關於PHP擴展開發的常見問題(常見問題解答)什麼是PHP-CPP,它與PHP有何不同?它提供了有據可查和用戶友好型類的集合,使C開發人員可以編寫PHP擴展名,而無需直接與Zend API合作的複雜性。與PHP是一種解釋的語言不同,PHP-CPP允許您以C(Comperied語言)編寫代碼。這可能會導致性能改進,因為編譯的代碼通常比解釋的代碼更快。 >如何在系統上安裝php-cpp?
>調試PHP擴展程序可能會有些棘手,因為您''重新處理一種編譯的語言。但是,您可以使用GDB(GNU調試器)等工具進行調試。 GDB允許您設置斷點,逐步瀏覽代碼並檢查變量,在嘗試追踪錯誤時,這可能非常有用。
我可以使用php-cpp創建PHP 7的擴展名。
是的,PHP-CPP與PHP 7兼容。但是,您需要確保使用最新版本的PHP-CPP,因為較早的版本可能不支持PHP 7。>我如何處理PHP-CPP中的異常?
php-cpp提供一個名為php ::異常的類,您可以用來從C代碼中拋出異常。這些例外可以像其他任何PHP例外一樣在您的PHP代碼中捕獲和處理。
>我可以使用PHP-CPP創建面向對象的擴展嗎?您可以在C代碼中定義類,然後可以在PHP代碼中使用這些類。這使您可以編寫易於維護的干淨,模塊化的代碼。
>如何從我的C代碼中調用PHP函數?
>
>一旦您''如何分發我的php擴展名? VE構建了PHP擴展名,您可以通過將其包裝為PECL包裝來分配它。 PECL是PHP擴展的存儲庫,它提供了分發和安裝擴展的標準方法。以上是通過PHP-CPP開始PHP擴展開發的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

PHP8.1中的枚舉功能通過定義命名常量增強了代碼的清晰度和類型安全性。 1)枚舉可以是整數、字符串或對象,提高了代碼可讀性和類型安全性。 2)枚舉基於類,支持面向對象特性,如遍歷和反射。 3)枚舉可用於比較和賦值,確保類型安全。 4)枚舉支持添加方法,實現複雜邏輯。 5)嚴格類型檢查和錯誤處理可避免常見錯誤。 6)枚舉減少魔法值,提升可維護性,但需注意性能優化。

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

RESTAPI設計原則包括資源定義、URI設計、HTTP方法使用、狀態碼使用、版本控制和HATEOAS。 1.資源應使用名詞表示並保持層次結構。 2.HTTP方法應符合其語義,如GET用於獲取資源。 3.狀態碼應正確使用,如404表示資源不存在。 4.版本控制可通過URI或頭部實現。 5.HATEOAS通過響應中的鏈接引導客戶端操作。

在PHP中,異常處理通過try,catch,finally,和throw關鍵字實現。 1)try塊包圍可能拋出異常的代碼;2)catch塊處理異常;3)finally塊確保代碼始終執行;4)throw用於手動拋出異常。這些機制幫助提升代碼的健壯性和可維護性。

匿名類在PHP中的主要作用是創建一次性使用的對象。 1.匿名類允許在代碼中直接定義沒有名字的類,適用於臨時需求。 2.它們可以繼承類或實現接口,增加靈活性。 3.使用時需注意性能和代碼可讀性,避免重複定義相同的匿名類。
