摘要:前面兩節(jié)介紹了如何用編寫常用的擴展函數(shù),擴展類。對怎么使用開發(fā)擴展應(yīng)該已經(jīng)很熟悉了,下面晉級學(xué)習(xí)一下關(guān)于擴展函數(shù)參數(shù)類型方面的內(nèi)容。
PHP擴展是高級PHP程序員必須了解的技能之一,對于一個初入門的PHP擴展開發(fā)者,怎么才能開發(fā)一個成熟的擴展,進入PHP開發(fā)的高級領(lǐng)域呢?本系列開發(fā)教程將手把手帶您從入門進入高級階段。
本教程系列在linux下面開發(fā)(推薦使用centos),php版本用的是5.6,并假設(shè)您有一定的linux操作經(jīng)驗和c/c++基礎(chǔ)。
有問題需要溝通的朋友請加QQ技術(shù)交流群32550793和我溝通。
前面兩節(jié)介紹了如何用PHP-CPP編寫常用的擴展函數(shù),擴展類。對怎么使用PHP-CPP開發(fā)擴展應(yīng)該已經(jīng)很熟悉了,下面晉級學(xué)習(xí)一下關(guān)于擴展函數(shù)參數(shù)類型方面的內(nèi)容。
下面教程內(nèi)容的相關(guān)源碼已經(jīng)上傳到github上面。
git clone https://github.com/elvisszhang/phpcpp_param.git一、相關(guān)知識:PHP-CPP參數(shù)類型指定方式
有時候,我們開發(fā)的函數(shù),我們希望只能傳入特定的類型,例如字符串運算的函數(shù)只能傳入字符串參數(shù),數(shù)值運算的函數(shù)只能傳入數(shù)字參數(shù),數(shù)組操作的函數(shù)只能傳入數(shù)組參數(shù)。
下面是擴展中如何指定一個函數(shù)參數(shù)類型的樣例代碼
#includevoid example(Php::Parameters ¶ms) { } extern "C" { PHPCPP_EXPORT void *get_module() { static Php::Extension myExtension("my_extension", "1.0"); myExtension.add ("example", { Php::ByVal("a", Php::Type::Numeric), Php::ByVal("b", "ExampleClass"), Php::ByVal("c", "OtherClass") }); return myExtension; } }
上面的 Php::ByVal 是代表值類型的參數(shù)的設(shè)定方式,聰明點的你應(yīng)該猜到相對應(yīng)還有一個 Php::ByRef的代表引用類型的參數(shù)設(shè)定方式。可惜的是在php5.x擴展上面,經(jīng)過實驗證明,引用方式的參數(shù)設(shè)定無效。
二、相關(guān)知識:Php::ByVal函數(shù)說明Php::ByVal 是代表值類型的參數(shù)的設(shè)定方式,總共有兩個函數(shù)原型定義。
第一種原型是給標量,數(shù)組,對象,匿名函數(shù)等參數(shù)類型使用的,其C++的函數(shù)定義如下。
/** * ByVal 值類型的參數(shù)的設(shè)定方式 * @param name 參數(shù)名稱 * @param type 參數(shù)類型 * @param required 參數(shù)是否必填,默認必填 */ ByVal(const char *name, Php::Type type, bool required = true);
第二種原型是給具有特定類名的函數(shù)參數(shù)使用的,其C++的函數(shù)定義如下。
/** * ByVal 值類型的參數(shù)的設(shè)定方式 * @param name 參數(shù)名稱 * @param classname 參數(shù)類名 * @param nullable 是否可以為空 * @param required 參數(shù)是否必填,默認必填 */ ByVal(const char *name, const char *classname, bool nullable = false, bool required = true);
值得注意的是,PHP不存在所謂函數(shù)參數(shù)名這個說法,上面函數(shù)參數(shù)里面的name只是起一個助記符的作用,主要是在參數(shù)類型錯誤等異常情況下,拋出異常的錯誤信息里面使用,方便用戶知道具體是哪個參數(shù)有問題。三、相關(guān)知識:Php::Type參數(shù)類型說明
ByVal函數(shù)中的Php::Type是個C++的枚舉量,代表PHP-CPP的函數(shù)參數(shù),總共支持以下11種類型。
Php::Type::Null - 表示任何類型都可以傳入 Php::Type::Numeric - 整數(shù)類型 Php::Type::Float - 數(shù)值類型,支持整數(shù)、單精度浮點數(shù)、雙精度浮點數(shù) Php::Type::Bool - 布爾類型 Php::Type::Array - 數(shù)組類型 Php::Type::Object - 對象類型 Php::Type::String - 字符串類型 Php::Type::Resource - 資源類型(保存有為打開文件、數(shù)據(jù)庫連接、圖形畫布區(qū)域等的特殊句柄) Php::Type::Constant - 常量類型 Php::Type::ConstantArray - 常量數(shù)組類型 Php::Type::Callable - 函數(shù)類型
除了 Php::Type::Array or Php::Type::Object 這兩個類型的參數(shù)使用起來比較特殊,必須使用專用的對應(yīng)的C++類來操作。其他類型使用起來基本上差別不大,因為PHP::Value這個類已經(jīng)做了類型重載處理,。
四、代碼演示:階乘運算對于階乘運算函數(shù),我們都知道,需要而且只需傳入一個正整數(shù)類型即可。
下面是該擴展函數(shù)的C++源碼
//演示階乘 Php::Value pm_factorial(Php::Parameters ¶ms) { int n = (int)params[0]; if(n < 0 ) return 0; int i,f=1; for(i=1;i<=n;i++) f *= i; return f; }
注冊擴展函數(shù)的代碼
myExtension.add("pm_factorial", { Php::ByVal("a", Php::Type::Numeric) });
PHP測試代碼(test/1.php)
測試返回結(jié)果
# php test/1.php -----TEST pm_factorial()----- PHP Warning: pm_factorial() expects at least 1 parameter(s), 0 given in /data/develop/phpcpp_param/test/1.php on line 3 NULL -----TEST pm_factorial("abc")----- int(1) -----TEST pm_factorial("5")----- int(120) -----TEST pm_factorial(0)----- int(1) -----TEST pm_factorial(10)----- int(3628800) -----TEST pm_factorial(-10)----- int(0) -----TEST pm_factorial(5.3)----- int(120)
根據(jù)以上測試結(jié)果,可以總結(jié)出:
對于整數(shù)類型參數(shù),會自動把浮點數(shù)強制轉(zhuǎn)成整形。
參數(shù)不足的時候,將會生成一個PHP警告,返回值為NULL。
整數(shù)類型的參數(shù)自動會轉(zhuǎn)換字符串類型,無法轉(zhuǎn)換時則轉(zhuǎn)換成0。
五、代碼演示:兩個數(shù)值(浮點數(shù))類型參數(shù)相加以演示兩個數(shù)字相加為例,我們希望傳入兩個參數(shù),而且兩個參數(shù)都是數(shù)值類型。
下面是該擴展函數(shù)的C++源碼
//演示兩個數(shù)相加 Php::Value pm_add(Php::Parameters ¶ms) { return params[0] + params[1]; }
注冊擴展函數(shù)的代碼
myExtension.add("pm_add", { Php::ByVal("a", Php::Type::Float), Php::ByVal("b", Php::Type::Float) });
PHP測試代碼(test/2.php)
運行測試代碼,返回結(jié)果
# php test/2.php -----TEST pm_add()----- PHP Warning: pm_add() expects at least 2 parameter(s), 0 given in /data/develop/phpcpp_param/test/1.php on line 3 NULL -----TEST pm_add(1)----- PHP Warning: pm_add() expects at least 2 parameter(s), 1 given in /data/develop/phpcpp_param/test/1.php on line 6 NULL -----TEST pm_add("abc","def")----- int(0) -----TEST pm_add("1","2")----- int(3) -----TEST pm_add(1,2)----- int(3) -----TEST pm_add(1.3,2.4)----- float(3.7)
根據(jù)以上測試結(jié)果,可以總結(jié)出:
對于數(shù)值類型參數(shù),整數(shù),浮點數(shù)都支持。
參數(shù)不足的時候,將會生成一個PHP警告,返回值為NULL。
數(shù)值類型的參數(shù)自動會轉(zhuǎn)換字符串類型的數(shù)值,無法轉(zhuǎn)換時則轉(zhuǎn)換成0。
由于篇幅有限,其他的參數(shù)類型下一章節(jié)繼續(xù)演示。
六、參考文獻PHP-CPP官網(wǎng) - 關(guān)于函數(shù)參數(shù)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/28619.html
摘要:下面是該擴展函數(shù)的源碼。下面是該擴展函數(shù)的源碼測試引用類型參數(shù)注冊該擴展函數(shù)的代碼如下測試代碼如果直接輸入常量,會導(dǎo)致類型檢測通不過,觸發(fā)。 PHP擴展是高級PHP程序員必須了解的技能之一,對于一個初入門的PHP擴展開發(fā)者,怎么才能開發(fā)一個成熟的擴展,進入PHP開發(fā)的高級領(lǐng)域呢?本系列開發(fā)教程將手把手帶您從入門進入高級階段。本教程系列在linux下面開發(fā)(推薦使用centos),php...
摘要:下載命令行瀏覽器下載網(wǎng)址和倉庫網(wǎng)址一樣一不帶參數(shù),沒有返回值的擴展函數(shù)寫法函數(shù)功能打印以內(nèi)的素數(shù)函數(shù)名稱如何注冊擴展函數(shù)必須在函數(shù)體中,注冊函數(shù),以便能在中能直接調(diào)用。函數(shù)有返回值,返回值類型設(shè)置為。 PHP擴展是高級PHP程序員必須了解的技能之一,對于一個初入門的PHP擴展開發(fā)者,怎么才能開發(fā)一個成熟的擴展,進入PHP開發(fā)的高級領(lǐng)域呢?本系列開發(fā)教程將手把手帶您從入門進入高級階段。本...
摘要:二擴展類的普通函數(shù)支持的樣式擴展類的函數(shù),必須按照一定的規(guī)范來寫,返回值和參數(shù)的名稱類型都是有規(guī)定。最常見的是下面種函數(shù)樣式,跟上一章的普通函數(shù)的樣式其實差不多,返回值和參數(shù)的用法也完全一樣,所以就不再多說。 PHP擴展是高級PHP程序員必須了解的技能之一,對于一個初入門的PHP擴展開發(fā)者,怎么才能開發(fā)一個成熟的擴展,進入PHP開發(fā)的高級領(lǐng)域呢?本系列開發(fā)教程將手把手帶您從入門進入高級...
摘要:四使用語言開發(fā)是我重點推薦的擴展開發(fā)框架,簡明易懂,功能強大,開發(fā)效率高,代碼易維護,執(zhí)行速度快。優(yōu)點三支持,的擴展開發(fā)有兩套擴展開發(fā)框架,分別支持,,雖然框架代碼有兩個,但是接口卻是一樣的。 PHP擴展是高級PHP程序員必須了解的技能之一,對于一個初入門的PHP擴展開發(fā)者,怎么才能開發(fā)一個成熟的擴展,進入PHP開發(fā)的高級領(lǐng)域呢?本系列開發(fā)教程將手把手帶您從入門進入高級階段。本教程系列...
摘要:接著上一篇文章,本文開始在擴展內(nèi)實現(xiàn)類的定義和對象操作。因此定義類,需要在的回調(diào)中進行。使用類名方法名即可。連接成功連接失敗在中不僅可以創(chuàng)建擴展內(nèi)置的類,還可以創(chuàng)建代碼定義的類。 接著上一篇文章,本文開始在擴展內(nèi)實現(xiàn)類的定義和對象操作。基于PHP-X提供的封裝,使用C++語言可以輕松地實現(xiàn)一個PHP的類,還可以在C++代碼中創(chuàng)建任意PHP對象,調(diào)用對象方法、讀寫對象的屬性。 0x00 ...
閱讀 3797·2021-09-29 09:34
閱讀 3770·2021-09-27 13:34
閱讀 566·2021-09-24 09:47
閱讀 3037·2019-08-30 15:53
閱讀 1808·2019-08-26 13:54
閱讀 2086·2019-08-26 13:43
閱讀 531·2019-08-23 14:47
閱讀 1741·2019-08-23 14:28