摘要:下面是該擴(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
摘要:前面兩節(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版本用的...
摘要:下載命令行瀏覽器下載網(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)入高級階段。本...
摘要:二擴(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)入高級...
摘要:二下載第一個(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...
閱讀 820·2023-04-25 20:18
閱讀 2104·2021-11-22 13:54
閱讀 2547·2021-09-26 09:55
閱讀 3912·2021-09-22 15:28
閱讀 2982·2021-09-03 10:34
閱讀 1719·2021-07-28 00:15
閱讀 1645·2019-08-30 14:25
閱讀 1289·2019-08-29 17:16