自己寫PHP擴充套件之建立乙個類

2021-06-06 02:03:07 字數 3504 閱讀 3140

上一章用擴充套件建立了乙個變數..

這次來個大的..我們建立乙個類.

然後在php裡面去呼叫這個類.

生成擴充套件及修改 不知道的這裡  

這裡就不談了.

比如我們要建立乙個類..php**如下

class person 

public function __destruct()

public function getproperty($key)

public function setproperty($key,$val)

}

用php來做,很簡單..

那麼用php擴充套件來寫該怎麼做?

ok.1.在php_siren.h裡面宣告類

php_method(person,__construct);

php_method(person,__destruct);

php_method(person,setproperty);

php_method(person,getproperty);

php_method巨集.

php_method 等於zend_method

這個巨集接受兩個引數,第乙個是類名,第二個是類的方法

#define zend_method(classname, name)    zend_named_function(zend_mn(classname##_##name))

#define internal_function_parameters int ht, zval *return_value, zval **return_value_ptr, zval *this_ptr, int return_v alue_used tsrmls_dc

//最後等於

void name(int ht, zval *return_value, zval **return_value_ptr, zval *this_ptr, int return_v alue_used tsrmls_dc )

這個巨集是用來宣告我們的方法...

2.設定接收的引數

我們的方法如果需要接受引數.那麼就要執行 

zend_begin_arg_info_ex(arg_person_info,0,0,2) 

zend_arg_info(0,name)

zend_end_arg_info()

詳細講這幾個巨集之前先看看zend_arg_info

typedef struct _zend_arg_info  zend_arg_info;

zend_begin_arg_info_ex定義在zend/zend_api.h 

#define zend_begin_arg_info_ex(name, pass_rest_by_reference, return_reference, required_num_args)       \

static const zend_arg_info name = ,

很明顯 宣告乙個zend_arg_info的陣列name,然後初始化結構體的值

zend_arg_info(0,name)的定義如下

#define zend_arg_info(pass_by_ref, name)  ,

這三個巨集 執行** 等於

static const zend_arg_info name = ,

,};

3.建立zend_function_entry結構陣列

const zend_function_entry person_functions=;
zend_function_entry定義如下

typedef struct _zend_function_entry  zend_function_entry;

php_me巨集接收四個引數

1 類名,

2 方法名,

3 zend_arg_info 的引數列表,

zend_acc_public zend_acc_private zend_acc_protected是我們類裡面的三個訪問許可權

zend_acc_ctor標示建構函式

zend_acc_dtor標示析構函式

4.修改php_minit_function

前面我們說過 php_minit_function是在模組啟動的時候執行的函式

首先建立乙個全域性指標 zend_class_entry *person_ce;

在php_minit_function加入如下**

zend_class_entry person;

init_class_entry(person,"person",person_functions);

person_ce=zend_register_internal_class_ex(&person,null,null tsrmls_cc);

zend_declare_property_null(person_ce,zend_strl("name"),zend_acc_public tsrmls_cc);

1行建立乙個zend_class_entry物件person.

zend_class_entry這個結構體前面也講過

php核心研究之類的實現 

2行初始化zend_class_entry 它執行了如下**

可以對應 

php核心研究之類的實現 來分析

5.建立 php_siren.h標頭檔案中的方法體

php_method(person,__construct)

php_method(person,__destruct)

php_method(person,setproperty)

php_method(person,getproperty)

6.最後make&& make install

編譯我們的擴充套件,

重新啟動apache.

<?php

$p=new person();

?>

我們就能在瀏覽器裡看到輸出的內容

construct is running

destruct is running

這樣 ..我們用擴充套件建立的乙個基本類就完成了.

自己寫PHP擴充套件之建立乙個普通變數

宣告 本文為斯人原創,全部為作者一一分析得之,有不對的地方望賜教。php寫擴充套件.如果您還麼有讀 原 用c c 擴充套件php 建議您先看一下 這篇文章.今天來個簡單的.我們用擴充套件方式建立乙個變數 siren.然後在php檔案裡面輸出這個變數.1.執行原始碼目錄中的 ext skel extn...

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上傳類

主要功能 檔案上傳,獲取檔名,獲取檔案大小,隨機生成新檔名,獲取檔案型別,生成縮圖,返回縮略 件名,返回上傳後生成的檔案的檔名,返回上傳後的檔案路徑 class ieb upload if dirpath else 檢查檔案是否存在 function scanfile return scan 獲取檔...