PHP擴充套件開發(2) 實現類擴充套件

2021-06-18 09:00:59 字數 2435 閱讀 6556

在第一篇文章中,我們所開發的擴充套件是單個函式,本篇文章看一下如何開發乙個類擴充套件。假設我們要用php擴充套件實 現乙個類person,它有乙個private的成員變數$_name和兩個public的例項方法getname()和setname(),可以用 php**表示如下:

<?php

class person

public function setname($name)

}

1. 宣告方法:還使用第一篇文章裡面用過的示例,首先在標頭檔案php_fetion_echo.h裡加入方法宣告。

php_method(person, __construct);

php_method(person, __destruct);

php_method(person, getname);

php_method(person, setname);

前面的擴充套件在宣告函式時使用php_function巨集,而在實現類擴充套件時我們使用php_method巨集,第乙個引數指定類名,第二個引數指定方法名。

2. 方法實現:在fetion_echo.c檔案中實現這幾個方法,建構函式和析構函式中只是輸出一些文字。

php_method(person, __construct) 

php_method(person, __destruct)

php_method(person, getname)

php_method(person, setname)

self = getthis();

make_std_zval(value);

zval_stringl(value, arg, arg_len, 0);

separate_zval_to_make_is_ref(&value);

zend_update_property(z_objce_p(self), self, zend_strl("_name"), value tsrmls_cc);

return_true;

}

對上面的**做一些解釋:

a. 獲取方法的引數資訊,仍然使用zend_parse_parameters函式,與之前我們介紹過的一樣;

b. 獲取this指標(相對於php**而言,在php擴充套件中仍然使用zval結構表示)使用getthis()函式;

c. 使用make_std_zval巨集申請並初始化乙個zval結構,在php擴充套件中,所有的資料型別其實都是用zval結構來表示的,在本系列文章中我會單獨寫一篇來介紹zval。

d. 獲取屬性值使用zend_read_property()函式,使用zend_update_property()函式更新屬性值。

3. 初始化類:在擴充套件初始化函式中,註冊並初始化類。

zend_class_entry *person_ce;

php_minit_function(fetion_echo)

使用init_class_entry巨集初始化類,第二個引數指定類名,第三個引數是函式表。

4. 註冊到函式:宣告方法的引數,並註冊到函式表中。

zend_begin_arg_info(arg_person_setname, 0)

zend_arg_info(0, name)

zend_end_arg_info()

const zend_function_entry fetion_echo_functions = /* must be the last line in fetion_echo_functions */

};

類方法引數的宣告與之前我們函式引數宣告方式一致,在註冊類方法到函式表中時使用php_me巨集,而不是之前使用的php_fe巨集。

zend_acc_public:指定方法的訪問修飾符

zend_acc_ctor:指定該方法為建構函式

zend_acc_dtor:指定該方法為析構函式

5. 執行測試:編譯安裝擴充套件後,編寫一段簡單的測試指令碼:

<?php 

$person = new person();

$person->setname("terrylee");

echo $person->getname().'

';

執行後可以看到如下輸出,說明擴充套件工作正常:

__construct called.

terrylee

__destruct called.

在後面的文章,我會介紹更詳細介紹php extension開發內容,如ini設定,全域性變數,引數傳遞等。

[**] 

php擴充套件開發

php擴充套件 pecl 跟php引擎一樣都是使用c語言開發。php核心開發組成員鳥哥laruence使用的是vim進行php開發。書籍 案例 php src ext pecl開發郵件組 盡量編寫一些phpt測試用例,php src tests下有很多參考.測試時用 enable debug編譯ph...

php擴充套件開發

二 php擴充套件開發 擴充套件開發流程 生成開發骨架 修改config.m4 編碼 編譯擴充套件為so 修改php.ini 1.生成開發骨架 1.1 進入擴充套件目錄 cd php 7.0.1 ext 1.2 用.ext skel生成骨架 ext skel extname module 1.3 修...

PHP擴充套件開發

php function say hello len spprintf strg,0,hello s n arg return stringl strg,len,0 1.引數接收 這裡接收函式的引數需要通過zend parse parameter函式解析,第乙個引數指定使用者傳入say hello函...