原文:
假設我們要用php擴充套件實 現乙個類person,它有乙個private的成員變數$_name和兩個public的例項方法getname()和setname(),可以用 php**表示如下:?1
2345
6789
1011
12<?php
class
person
public
function
setname(
$name
)
}
php_method(person, __construct);前面的擴充套件在宣告函式時使用php_function巨集,而在實現類擴充套件時我們使用php_method巨集,第乙個引數指定類名,第二個引數指定方法名。php_method(person, __destruct);
php_method(person, getname);
php_method(person, setname);
2. 方法實現:在fetion_echo.c檔案中實現這幾個方法,建構函式和析構函式中只是輸出一些文字。?1
2345
6789
1011
1213
1415
1617
1819
2021
2223
2425
2627
2829
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;使用init_class_entry巨集初始化類,第二個引數指定類名,第三個引數是函式表。php_minit_function(fetion_echo)
4. 註冊到函式:宣告方法的引數,並註冊到函式表中。
zend_begin_arg_info(arg_person_setname, 0)類方法引數的宣告與之前我們函式引數宣告方式一致,在註冊類方法到函式表中時使用php_me巨集,而不是之前使用的php_fe巨集。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 */ };
zend_acc_public:指定方法的訪問修飾符
zend_acc_ctor:指定該方法為建構函式
zend_acc_dtor:指定該方法為析構函式
5. 執行測試:編譯安裝擴充套件後,編寫一段簡單的測試指令碼:
<?php $person = new person();執行後可以看到如下輸出,說明擴充套件工作正常:$person->setname("mickelfeng"); echo $person->getname().'
';
__construct called.mickelfeng
__destruct called.
PHP擴充套件開發之建立乙個類
執行環境 php7.0以上版本和以下版本建立流程和使用的函式可能會有些差異 第一步,先生成乙個擴充套件骨架 cd php 7.1.10 cd ext ext skel extname clas tension vim clas tension config.m4去掉前面的dnl dnl php ar...
PHP 拓展 開發,PHP擴充套件開發 第乙個擴充套件
我們先假設業務場景,是需要有這麼乙個擴充套件,提供乙個叫ccvita string的函式,他的主要作用是返回一段字元。這個業務場景實在太假,大家就這麼看看吧 對應的php 可能是這樣 function ccvita string str result link return result 第一步,生...
PHP擴充套件開發(2) 實現類擴充套件
在第一篇文章中,我們所開發的擴充套件是單個函式,本篇文章看一下如何開發乙個類擴充套件。假設我們要用php擴充套件實 現乙個類person,它有乙個private的成員變數 name和兩個public的例項方法getname 和setname 可以用 php 表示如下 class person pub...