PHP擴充套件開發之建立乙個類

2021-08-10 06:19:56 字數 1825 閱讀 6736

執行環境:

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...