成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PHP擴(kuò)展開(kāi)發(fā)教程5 - 擴(kuò)展函數(shù)的參數(shù)類型(1)

DoINsiSt / 2254人閱讀

摘要:前面兩節(jié)介紹了如何用編寫(xiě)常用的擴(kuò)展函數(shù),擴(kuò)展類。對(duì)怎么使用開(kāi)發(fā)擴(kuò)展應(yīng)該已經(jīng)很熟悉了,下面晉級(jí)學(xué)習(xí)一下關(guān)于擴(kuò)展函數(shù)參數(shù)類型方面的內(nèi)容。

PHP擴(kuò)展是高級(jí)PHP程序員必須了解的技能之一,對(duì)于一個(gè)初入門(mén)的PHP擴(kuò)展開(kāi)發(fā)者,怎么才能開(kāi)發(fā)一個(gè)成熟的擴(kuò)展,進(jìn)入PHP開(kāi)發(fā)的高級(jí)領(lǐng)域呢?本系列開(kāi)發(fā)教程將手把手帶您從入門(mén)進(jìn)入高級(jí)階段。
本教程系列在linux下面開(kāi)發(fā)(推薦使用centos),php版本用的是5.6,并假設(shè)您有一定的linux操作經(jīng)驗(yàn)和c/c++基礎(chǔ)。
有問(wèn)題需要溝通的朋友請(qǐng)加QQ技術(shù)交流群32550793和我溝通。

前面兩節(jié)介紹了如何用PHP-CPP編寫(xiě)常用的擴(kuò)展函數(shù),擴(kuò)展類。對(duì)怎么使用PHP-CPP開(kāi)發(fā)擴(kuò)展應(yīng)該已經(jīng)很熟悉了,下面晉級(jí)學(xué)習(xí)一下關(guān)于擴(kuò)展函數(shù)參數(shù)類型方面的內(nèi)容。

下面教程內(nèi)容的相關(guān)源碼已經(jīng)上傳到github上面。

git clone https://github.com/elvisszhang/phpcpp_param.git
一、相關(guān)知識(shí):PHP-CPP參數(shù)類型指定方式

有時(shí)候,我們開(kāi)發(fā)的函數(shù),我們希望只能傳入特定的類型,例如字符串運(yùn)算的函數(shù)只能傳入字符串參數(shù),數(shù)值運(yùn)算的函數(shù)只能傳入數(shù)字參數(shù),數(shù)組操作的函數(shù)只能傳入數(shù)組參數(shù)。

下面是擴(kuò)展中如何指定一個(gè)函數(shù)參數(shù)類型的樣例代碼

#include 

void 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è)定方式,聰明點(diǎn)的你應(yīng)該猜到相對(duì)應(yīng)還有一個(gè) Php::ByRef的代表引用類型的參數(shù)設(shè)定方式??上У氖窃趐hp5.x擴(kuò)展上面,經(jīng)過(guò)實(shí)驗(yàn)證明,引用方式的參數(shù)設(shè)定無(wú)效。

二、相關(guān)知識(shí):Php::ByVal函數(shù)說(shuō)明

Php::ByVal 是代表值類型的參數(shù)的設(shè)定方式,總共有兩個(gè)函數(shù)原型定義。

第一種原型是給標(biāo)量,數(shù)組,對(duì)象,匿名函數(shù)等參數(shù)類型使用的,其C++的函數(shù)定義如下。

/**
 *  ByVal 值類型的參數(shù)的設(shè)定方式
 *  @param  name        參數(shù)名稱
 *  @param  type        參數(shù)類型
 *  @param  required    參數(shù)是否必填,默認(rèn)必填
 */
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ù)是否必填,默認(rèn)必填
 */
ByVal(const char *name, const char *classname, bool nullable = false, bool required = true);
值得注意的是,PHP不存在所謂函數(shù)參數(shù)名這個(gè)說(shuō)法,上面函數(shù)參數(shù)里面的name只是起一個(gè)助記符的作用,主要是在參數(shù)類型錯(cuò)誤等異常情況下,拋出異常的錯(cuò)誤信息里面使用,方便用戶知道具體是哪個(gè)參數(shù)有問(wèn)題。
三、相關(guān)知識(shí):Php::Type參數(shù)類型說(shuō)明

ByVal函數(shù)中的Php::Type是個(gè)C++的枚舉量,代表PHP-CPP的函數(shù)參數(shù),總共支持以下11種類型。

Php::Type::Null     - 表示任何類型都可以傳入
Php::Type::Numeric  - 整數(shù)類型
Php::Type::Float    - 數(shù)值類型,支持整數(shù)、單精度浮點(diǎn)數(shù)、雙精度浮點(diǎn)數(shù)
Php::Type::Bool     - 布爾類型
Php::Type::Array    - 數(shù)組類型
Php::Type::Object         - 對(duì)象類型
Php::Type::String         - 字符串類型
Php::Type::Resource       - 資源類型(保存有為打開(kāi)文件、數(shù)據(jù)庫(kù)連接、圖形畫(huà)布區(qū)域等的特殊句柄)
Php::Type::Constant       - 常量類型
Php::Type::ConstantArray  - 常量數(shù)組類型
Php::Type::Callable       - 函數(shù)類型

除了 Php::Type::Array or Php::Type::Object 這兩個(gè)類型的參數(shù)使用起來(lái)比較特殊,必須使用專用的對(duì)應(yīng)的C++類來(lái)操作。其他類型使用起來(lái)基本上差別不大,因?yàn)镻HP::Value這個(gè)類已經(jīng)做了類型重載處理,。

四、代碼演示:階乘運(yùn)算

對(duì)于階乘運(yùn)算函數(shù),我們都知道,需要而且只需傳入一個(gè)正整數(shù)類型即可。
下面是該擴(kuò)展函數(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;
}

注冊(cè)擴(kuò)展函數(shù)的代碼

myExtension.add("pm_factorial", {
            Php::ByVal("a", Php::Type::Numeric)
});

PHP測(cè)試代碼(test/1.php)

測(cè)試返回結(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ù)以上測(cè)試結(jié)果,可以總結(jié)出:

對(duì)于整數(shù)類型參數(shù),會(huì)自動(dòng)把浮點(diǎn)數(shù)強(qiáng)制轉(zhuǎn)成整形。

參數(shù)不足的時(shí)候,將會(huì)生成一個(gè)PHP警告,返回值為NULL。

整數(shù)類型的參數(shù)自動(dòng)會(huì)轉(zhuǎn)換字符串類型,無(wú)法轉(zhuǎn)換時(shí)則轉(zhuǎn)換成0。

五、代碼演示:兩個(gè)數(shù)值(浮點(diǎn)數(shù))類型參數(shù)相加

以演示兩個(gè)數(shù)字相加為例,我們希望傳入兩個(gè)參數(shù),而且兩個(gè)參數(shù)都是數(shù)值類型。
下面是該擴(kuò)展函數(shù)的C++源碼

//演示兩個(gè)數(shù)相加
Php::Value pm_add(Php::Parameters ¶ms)
{
    return params[0] + params[1];
}

注冊(cè)擴(kuò)展函數(shù)的代碼

myExtension.add("pm_add", {
            Php::ByVal("a", Php::Type::Float),
            Php::ByVal("b", Php::Type::Float)
});

PHP測(cè)試代碼(test/2.php)

運(yùn)行測(cè)試代碼,返回結(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ù)以上測(cè)試結(jié)果,可以總結(jié)出:

對(duì)于數(shù)值類型參數(shù),整數(shù),浮點(diǎn)數(shù)都支持。

參數(shù)不足的時(shí)候,將會(huì)生成一個(gè)PHP警告,返回值為NULL。

數(shù)值類型的參數(shù)自動(dòng)會(huì)轉(zhuǎn)換字符串類型的數(shù)值,無(wú)法轉(zhuǎn)換時(shí)則轉(zhuǎn)換成0。

由于篇幅有限,其他的參數(shù)類型下一章節(jié)繼續(xù)演示。

六、參考文獻(xiàn)

PHP-CPP官網(wǎng) - 關(guān)于函數(shù)參數(shù)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/28619.html

相關(guān)文章

  • PHP擴(kuò)展開(kāi)發(fā)教程6 - 擴(kuò)展函數(shù)參數(shù)類型(2)

    摘要:下面是該擴(kuò)展函數(shù)的源碼。下面是該擴(kuò)展函數(shù)的源碼測(cè)試引用類型參數(shù)注冊(cè)該擴(kuò)展函數(shù)的代碼如下測(cè)試代碼如果直接輸入常量,會(huì)導(dǎo)致類型檢測(cè)通不過(guò),觸發(fā)。 PHP擴(kuò)展是高級(jí)PHP程序員必須了解的技能之一,對(duì)于一個(gè)初入門(mén)的PHP擴(kuò)展開(kāi)發(fā)者,怎么才能開(kāi)發(fā)一個(gè)成熟的擴(kuò)展,進(jìn)入PHP開(kāi)發(fā)的高級(jí)領(lǐng)域呢?本系列開(kāi)發(fā)教程將手把手帶您從入門(mén)進(jìn)入高級(jí)階段。本教程系列在linux下面開(kāi)發(fā)(推薦使用centos),php...

    draveness 評(píng)論0 收藏0
  • PHP擴(kuò)展開(kāi)發(fā)教程3 - 開(kāi)發(fā)一個(gè)我們自己數(shù)學(xué)函數(shù)庫(kù)

    摘要:下載命令行瀏覽器下載網(wǎng)址和倉(cāng)庫(kù)網(wǎng)址一樣一不帶參數(shù),沒(méi)有返回值的擴(kuò)展函數(shù)寫(xiě)法函數(shù)功能打印以內(nèi)的素?cái)?shù)函數(shù)名稱如何注冊(cè)擴(kuò)展函數(shù)必須在函數(shù)體中,注冊(cè)函數(shù),以便能在中能直接調(diào)用。函數(shù)有返回值,返回值類型設(shè)置為。 PHP擴(kuò)展是高級(jí)PHP程序員必須了解的技能之一,對(duì)于一個(gè)初入門(mén)的PHP擴(kuò)展開(kāi)發(fā)者,怎么才能開(kāi)發(fā)一個(gè)成熟的擴(kuò)展,進(jìn)入PHP開(kāi)發(fā)的高級(jí)領(lǐng)域呢?本系列開(kāi)發(fā)教程將手把手帶您從入門(mén)進(jìn)入高級(jí)階段。本...

    Barry_Ng 評(píng)論0 收藏0
  • PHP擴(kuò)展開(kāi)發(fā)教程4 - 開(kāi)發(fā)我們自己接口類

    摘要:二擴(kuò)展類的普通函數(shù)支持的樣式擴(kuò)展類的函數(shù),必須按照一定的規(guī)范來(lái)寫(xiě),返回值和參數(shù)的名稱類型都是有規(guī)定。最常見(jiàn)的是下面種函數(shù)樣式,跟上一章的普通函數(shù)的樣式其實(shí)差不多,返回值和參數(shù)的用法也完全一樣,所以就不再多說(shuō)。 PHP擴(kuò)展是高級(jí)PHP程序員必須了解的技能之一,對(duì)于一個(gè)初入門(mén)的PHP擴(kuò)展開(kāi)發(fā)者,怎么才能開(kāi)發(fā)一個(gè)成熟的擴(kuò)展,進(jìn)入PHP開(kāi)發(fā)的高級(jí)領(lǐng)域呢?本系列開(kāi)發(fā)教程將手把手帶您從入門(mén)進(jìn)入高級(jí)...

    xiaodao 評(píng)論0 收藏0
  • PHP擴(kuò)展開(kāi)發(fā)教程1 - 相關(guān)開(kāi)發(fā)技術(shù)對(duì)比及介紹

    摘要:四使用語(yǔ)言開(kāi)發(fā)是我重點(diǎn)推薦的擴(kuò)展開(kāi)發(fā)框架,簡(jiǎn)明易懂,功能強(qiáng)大,開(kāi)發(fā)效率高,代碼易維護(hù),執(zhí)行速度快。優(yōu)點(diǎn)三支持,的擴(kuò)展開(kāi)發(fā)有兩套擴(kuò)展開(kāi)發(fā)框架,分別支持,,雖然框架代碼有兩個(gè),但是接口卻是一樣的。 PHP擴(kuò)展是高級(jí)PHP程序員必須了解的技能之一,對(duì)于一個(gè)初入門(mén)的PHP擴(kuò)展開(kāi)發(fā)者,怎么才能開(kāi)發(fā)一個(gè)成熟的擴(kuò)展,進(jìn)入PHP開(kāi)發(fā)的高級(jí)領(lǐng)域呢?本系列開(kāi)發(fā)教程將手把手帶您從入門(mén)進(jìn)入高級(jí)階段。本教程系列...

    alaege 評(píng)論0 收藏0
  • PHP-X 系列教程擴(kuò)展內(nèi)定義類和對(duì)象

    摘要:接著上一篇文章,本文開(kāi)始在擴(kuò)展內(nèi)實(shí)現(xiàn)類的定義和對(duì)象操作。因此定義類,需要在的回調(diào)中進(jìn)行。使用類名方法名即可。連接成功連接失敗在中不僅可以創(chuàng)建擴(kuò)展內(nèi)置的類,還可以創(chuàng)建代碼定義的類。 接著上一篇文章,本文開(kāi)始在擴(kuò)展內(nèi)實(shí)現(xiàn)類的定義和對(duì)象操作?;赑HP-X提供的封裝,使用C++語(yǔ)言可以輕松地實(shí)現(xiàn)一個(gè)PHP的類,還可以在C++代碼中創(chuàng)建任意PHP對(duì)象,調(diào)用對(duì)象方法、讀寫(xiě)對(duì)象的屬性。 0x00 ...

    cpupro 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<