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

資訊專欄INFORMATION COLUMN

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

draveness / 3571人閱讀

摘要:下面是該擴(kuò)展函數(shù)的源碼。下面是該擴(kuò)展函數(shù)的源碼測試引用類型參數(shù)注冊該擴(kuò)展函數(shù)的代碼如下測試代碼如果直接輸入常量,會導(dǎo)致類型檢測通不過,觸發(fā)。

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

繼續(xù)上一節(jié)的內(nèi)容,講解擴(kuò)展函數(shù)的參數(shù)類型,下面教程內(nèi)容的相關(guān)源碼已經(jīng)上傳到github上面,見param子目錄下的演示代碼。

git clone https://github.com/elvisszhang/phpcpp_demo.git
cd param
一、代碼演示:對象類作為參數(shù)的用法

我們這里使用php的DateTime類作為擴(kuò)展函數(shù)的參數(shù)來演示如何傳入對象。
下面是該擴(kuò)展函數(shù)的C++源碼。

//演示時(shí)間類型操作
void pm_datetype(Php::Parameters ¶ms)
{
    Php::Value time = params[0];
    Php::out <<"param type is : " << time.type() << std::endl;
    Php::out <<"current time is : " << time.call("format","Y-m-d H:i:s") << std::endl;
}

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

myExtension.add("pm_datetype", {
    /****
        "time" : 表示參數(shù)名稱,用于返回的異常信息中使用
        "DateTime":參數(shù)對象的類名
        true :表示該參數(shù)是必須的
    ****/
     Php::ByVal("time", "DateTime", true)
});

PHP測試代碼(test/3.php)

執(zhí)行測試代碼,結(jié)果如下

# php test/3.php

-----TEST pm_datetype($time)-----
2018-04-17 19:57:57

-----TEST pm_datetype("2018-04-17")-----
PHP Catchable fatal error:  Argument 1 passed to pm_datetype() must be an instance of DateTime, string given in /data/develop/phpcpp_param/test/3.php on line 7

根據(jù)測試結(jié)果可見:

參數(shù)類型指定為特定類的對象后,傳入其他類型參數(shù)將觸發(fā)生成一個(gè)fatal error

可以使用 Php::Value的 call方法來執(zhí)行對象類的函數(shù)方法,非常方便。

二、代碼演示:匿名函數(shù)或函數(shù)名稱作為參數(shù)類型

大家知道c++的模板類可以讓同一個(gè)類可以處理各種不同數(shù)據(jù)類型,非常強(qiáng)大。
下面實(shí)現(xiàn)一個(gè)冒泡排序算法,使用匿名函數(shù)作為參數(shù),讓這個(gè)冒泡排序算法也能夠?qū)Ω鞣N不同類型元素的數(shù)組都能進(jìn)行排序,而且不管正向反向,數(shù)字還是文本或者是復(fù)雜結(jié)構(gòu)元素都能排序。

下面是該擴(kuò)展函數(shù)的C++源碼

//演示通用的冒泡排序類
Php::Value pm_sort(Php::Parameters ¶ms){
    int i,j;
    Php::Value array = params[0];
    Php::Value cmpfunc = params[1];
    int len = array.size();
    Php::Value result,temp;
    for(i=0;i

注冊該擴(kuò)展函數(shù)的代碼如下

myExtension.add("pm_sort", {
     Php::ByVal("a", Php::Type::Array), //第一個(gè)是數(shù)組類型
     Php::ByVal("b", Php::Type::Callable) //第二個(gè)是函數(shù)類型
});

PHP測試代碼(test/4.php)

 $a則往上冒泡,所以是降序排列
    return $b > $a;
});

echo var_export($result);

echo PHP_EOL . "-----數(shù)字升序排列-----" . PHP_EOL;
$result = pm_sort(array(22,3,15),function($a,$b){
    //$b < $a 則往上冒泡,所以是升序排列
    return $b < $a;
});
echo var_export($result);

echo PHP_EOL . "-----學(xué)生成績降序排列-----" . PHP_EOL;
$score = array(
    array("name" => "張三", "score"=>78),
    array("name" => "李四", "score"=>98),
    array("name" => "王五", "score"=>88),
);
$result = pm_sort($score,function($a,$b){
    //$b["score"] > $a["score"] 則往上冒泡,所以是按成績進(jìn)行降序排列
    return $b["score"] > $a["score"];
});
echo var_export($result);

echo PHP_EOL . "-----字符串按長度升序排列-----" . PHP_EOL;
function cmp_strlen($a,$b){
    //strlen($b) < strlen($a) 則往上冒泡,所以是按字符串長度進(jìn)行升序排列
    return strlen($b) < strlen($a);
}
$result = pm_sort(array("country","I","love","my"),"cmp_strlen");
echo var_export($result);

echo PHP_EOL . "-----名字按首字母升序排列-----" . PHP_EOL;
class MyNameSort{
    public static function cmpLetter($a,$b){
        //首字母asscii碼小的,則往上冒泡,所以是按首字母進(jìn)行升序排列
        return ord($b[0]) < ord($a[0]);
    }
}
$result = pm_sort(array("Jack","Tom","Michael","Smith"),"MyNameSort::cmpLetter");
echo var_export($result);
?>

運(yùn)行測試代碼,輸出結(jié)果如下

# php test/4.php

-----數(shù)字降序排列-----
array (
  0 => 22,
  1 => 15,
  2 => 3,
)
-----數(shù)字升序排列-----
array (
  0 => 3,
  1 => 15,
  2 => 22,
)
-----學(xué)生成績降序排列-----
array (
  0 =>
  array (
    "name" => "李四",
    "score" => 98,
  ),
  1 =>
  array (
    "name" => "王五",
    "score" => 88,
  ),
  2 =>
  array (
    "name" => "張三",
    "score" => 78,
  ),
)
-----字符串按長度升序排列-----
array (
  0 => "I",
  1 => "my",
  2 => "love",
  3 => "country",
)
-----名字按首字母升序排列-----
array (
  0 => "Jack",
  1 => "Michael",
  2 => "Smith",
  3 => "Tom",
)

根據(jù)上述測試代碼可見

函數(shù)類型的參數(shù)可以是匿名函數(shù),

函數(shù)類型的參數(shù)也可以是字符串類型的函數(shù)名稱

函數(shù)類型的參數(shù)還可以是類的靜態(tài)函數(shù)的函數(shù)名

使用函數(shù)類型參數(shù)傳入有助于實(shí)現(xiàn)高效簡潔的代碼

三、代碼演示:引用類型的參數(shù)類型

按照官網(wǎng)文檔的說法,PHP-CPP是支持引用類型的,而且官方文檔還給了一個(gè)swap(參數(shù)值對換)的演示代碼。我們按官網(wǎng)的文檔進(jìn)行一下實(shí)驗(yàn)。很遺憾,大家會發(fā)現(xiàn)對于PHP5.x這個(gè)特性是不支持的,PHP7.x系列也許支持,有條件的可以試驗(yàn)一下看看。

下面是該擴(kuò)展函數(shù)的C++源碼

//測試引用類型參數(shù)
void pm_swap(Php::Parameters ¶ms)
{
    Php::Value temp = params[0];
    params[0] = params[1];
    params[1] = temp;
}

注冊該擴(kuò)展函數(shù)的代碼如下

myExtension.add("pm_swap", {
        Php::ByRef("a", Php::Type::Numeric),
        Php::ByRef("b", Php::Type::Numeric)
});

PHP測試代碼(test/5.php)

$a = 123;
$b = 456;
echo "before swap: $a = " . $a . " $b = " . $b . PHP_EOL;
pm_swap($a,$b);
echo "after swap: $a = " . $a . " $b = " . $b . PHP_EOL;

// 如果直接輸入常量,會導(dǎo)致類型檢測通不過,觸發(fā)php error。
//pm_swap(10,20);

運(yùn)行測試代碼,輸出結(jié)果如下

before swap: $a = 123 $b = 456
after swap: $a = 123 $b = 456

根據(jù)測試結(jié)果可見,$a,$b的值還是保持原樣,沒有交換過來,所以引用類型的參數(shù)在PHP5.x事實(shí)上不支持。PHP7.x是否支持還需要進(jìn)一步實(shí)驗(yàn)。

四、參考文獻(xiàn)

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

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

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

相關(guān)文章

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

    摘要:前面兩節(jié)介紹了如何用編寫常用的擴(kuò)展函數(shù),擴(kuò)展類。對怎么使用開發(fā)擴(kuò)展應(yīng)該已經(jīng)很熟悉了,下面晉級學(xué)習(xí)一下關(guān)于擴(kuò)展函數(shù)參數(shù)類型方面的內(nèi)容。 PHP擴(kuò)展是高級PHP程序員必須了解的技能之一,對于一個(gè)初入門的PHP擴(kuò)展開發(fā)者,怎么才能開發(fā)一個(gè)成熟的擴(kuò)展,進(jìn)入PHP開發(fā)的高級領(lǐng)域呢?本系列開發(fā)教程將手把手帶您從入門進(jìn)入高級階段。本教程系列在linux下面開發(fā)(推薦使用centos),php版本用的...

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

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

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

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

    xiaodao 評論0 收藏0
  • PHP擴(kuò)展開發(fā)教程2 - 編寫第一個(gè)擴(kuò)展 hello world

    摘要:二下載第一個(gè)擴(kuò)展第一個(gè)擴(kuò)展的源碼已經(jīng)在上準(zhǔn)備好了,直接用命令克隆,或者手工下載都可以。第四步確認(rèn)擴(kuò)展已經(jīng)安裝成功使用命令可以查看目前已經(jīng)安裝的所有擴(kuò)展。 PHP擴(kuò)展是高級PHP程序員必須了解的技能之一,對于一個(gè)初入門的PHP擴(kuò)展開發(fā)者,怎么才能開發(fā)一個(gè)成熟的擴(kuò)展,進(jìn)入PHP開發(fā)的高級領(lǐng)域呢?本系列開發(fā)教程將手把手帶您從入門進(jìn)入高級階段。本教程系列在linux下面開發(fā)(推薦使用cento...

    Berwin 評論0 收藏0

發(fā)表評論

0條評論

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