執行環境:
php7.0以上版本和以下版本建立流程和使用的函式可能會有些差異第一步,先生成乙個擴充套件骨架
cd php-7.1.10
cd ext
./ext_skel --extname=clas***tension
vim clas***tension/config.m4
去掉前面的dnl
dnl php_arg_enable(.....
dnl [ --enable.....)
:wq
退出並儲存
第二步, 修改clas***tension.c
, 比如我們要增加乙個類名為person
, 並擁有乙個靜態成員函式叫say
, 這個函式的作用就是列印給定的字串到終端.
php_method(person, say)
定義乙個方法時, 我們使用php_method
巨集, 這個巨集有兩個引數,類名和方法名。定義好了方法,php引擎如何知道你定義的方法需要幾個引數呢?這個時候又要用到另外乙個巨集zend_begin_arg_info_ex
對需要引數進行描述.
zend_begin_arg_info_ex(arginfo_say_message, 0, 0, 1)
zend_arg_info(0, message)
zend_end_arg_info()
zend_begin_arg_info_ex
有四個引數
zend_arg_info
有兩個引數
上面我們提到建立的方法為類的靜態方法, 那php引擎如何知道這個方法為靜態方法?定義乙個函式實體集, 並使用php_me
巨集.
const zend_function_entry clas***tension_functions = ;
php_me
有四個引數
最終把定義好的方法註冊到php引擎中
php_minit_function(clas***tension)
我們的函式最終會被解析成下面這個樣子:
void person_say(zend_execute_data *execute_data, zval *return_value)
while (0);
}
編譯這個擴充套件, 並加入到php.ini
phpize
./configure && make && sudo make install
查詢php.ini
的位置
php -i | grep ini
# 一般ini檔案在/usr/local/lib下
vim /usr/local/lib/php.ini
extension_dir = "擴充套件目錄絕對路徑"
extension=clas***tension.so
再執行php -m | grep clas***tension
, 看看是否成功.
執行php -r "person::say('hello');"
看看結果.
用擴充套件開發乙個PHP類
原文 假設我們要用php擴充套件實 現乙個類person,它有乙個private的成員變數 name和兩個public的例項方法getname 和setname 可以用 php 表示如下 1 2345 6789 1011 12classperson publicfunctionsetname nam...
PHP 拓展 開發,PHP擴充套件開發 第乙個擴充套件
我們先假設業務場景,是需要有這麼乙個擴充套件,提供乙個叫ccvita string的函式,他的主要作用是返回一段字元。這個業務場景實在太假,大家就這麼看看吧 對應的php 可能是這樣 function ccvita string str result link return result 第一步,生...
PHP擴充套件開發之簡單類開發
接下來我們要用擴充套件的形式實現以下類 演示環境 linux php 5.5.34 src 1 2class person3 9public function setname name 10 13 在php原始碼目錄下 1 cd php 5.5.34 src 2cd ext 3 ext skel e...