自己動手用C擴充套件PHP(二)

2021-05-28 08:48:32 字數 1424 閱讀 6934

在上一章裡我們介紹了如何編寫自己的函式,接下來,我們開始編寫乙個有引數有返回值的擴充套件函式。

因為zend沒有正式的函式呼叫語法檢查支援,所以我們在編寫擴充套件函式的時候必須得「小心」,也就是我們必須得嚴格地進行呼叫合法性檢查。首先,我們寫乙個函式:

#include "string.h"

php_function(haosoft_strcat)

return_stringl(strcat(pc_arg_one, pc_arg_tow), (arg_one_len + arg_tow_len), 1);}

我們來分析這個函式: 1:

if (zend_parse_parameters(zend_num_args() tsrmls_cc, "ss", &pc_arg_one, &arg_one_len, &pc_arg_tow, &arg_tow_len) == failure)

這句就是進行引數檢查與取得引數的語句,zend_parse_parameters()是zend提供的api函式,第乙個引數是引數的數量,可以通過zend提供的zend_num_args()來取得,tsrmls_cc是必須的,第三個引數「ss」指明引數的型別(s - 字串),這個函式有2個字串引數,所以為「ss」,之後的引數就是你要取得的引數值了。注意:如果引數型別為「s」的話,引數值後面還要傳乙個long來取得字串的長度。

zend_parse_parameters函式成功的話會返回success,失敗則返回failure,並且輸出錯誤資訊。 2:

return_stringl(strcat(pc_arg_one, pc_arg_tow), (arg_one_len + arg_tow_len), 1);

這句的作用是返回乙個值,return_stringl()為返回字串,詳細資訊可以參閱zend api參考手冊。這句作用是連線兩個字串引數並返回。

編譯好擴充套件模組後,現在我們可以在 php 裡呼叫這個函式

<?php

$s_result = haosoft_strcat("a", "b");

echo $s_result;

?>

輸出:ab

說明:函式引數型別指定字元表,和一些返回函式返回值的函式可以參閱zend文件,這裡就不列出了。因為zend api說明文件不完全,許多macro及大多數zend api函式都沒有詳細說明。呵呵,所以如有錯誤地方,歡迎指正。

今天查閱了些zend的資料,用c++寫了一下php的擴充套件,覺得真的非常麻煩,乙個只有乙個myclass::getstring()方法的類,要實現在php裡:

<?php

$obj = new myclass();

$string = $obj->getstring();

?>

寫了好幾百行**,對於習慣物件導向形式程式設計的人簡直是噩夢,希望zend能在這方面改善一下了,等有時間我會再寫寫如何用c++編寫php的擴充套件。

自己動手用C擴充套件PHP(三)

在上兩章裡講述了擴充套件模組的基本用法,相信讀者已經能夠構建自己的擴充套件模組了,接下來,我們來看看幾個重要的函式 1 php minit function mymodule 當模組被zend engine ze 載入後,例如apache啟動,載入了php模組,ze會對每乙個擴充套件模組呼叫此函式 ...

自己動手用C擴充套件PHP 三

在上兩章裡講述了擴充套件模組的基本用法,相信讀者已經能夠構建自己的擴充套件模組了,接下來,我們來看看幾個重要的函式 1 php minit function mymodule 當模組被zend engine ze 載入後,例如apache啟動,載入了php模組,ze會對每乙個擴充套件模組呼叫此函式 ...

自己動手用c 寫控制項(下)

自己動手用c 寫控制項 下 因為我們這個控制項是實現背景漸變及文字填充,所以override paint事件以完成自畫。為了完成override,現在以下的準備工作 寫幾個在paint事件用的著的事件 使用角度的方法漸近重畫button private void drawbuttonwithangl...