php擴充套件開發筆記(1)建立類的陣列屬性

2021-07-03 00:24:38 字數 1197 閱讀 1027

初始化乙個類非常容易,例如下面的**

myclass_proterty_* 這個相關是 define 的巨集字串

zend_class_entry *myclass_ce;

zend_function_entry myclass_methods = ;

php_minit_function(myext)

以上的**都是一些簡單的屬性。

當想要給myclass這個類初始化乙個陣列的屬性的時候,失敗了,相對於php的**如下

class

myclass

/* 對應的c** */

zval *myarray;

make_std_zval

(myarray);

array_init(myarray);

zend_declare_property(myclass_ce, zend_strl(myclass_proterty_name_myclass), myarray, zend_acc_public

tsrmls_cc);

上面這段c**變異的時候並沒有發現什麼問題,在執行 new myclass() 的時候就出現問題了,報錯如下:

internal zval's can't be arrays, objects or resources
翻看zend的源**如下:

if (ce->type & zend_internal_class) 

}

當我們在呼叫zend_register_internal_class的時候,myclass_ce 已經初始化為zend_internal_class了,而此時的zend_declare_property的myarray引數則是is_array型別的,所以產生了這樣的錯誤。

為什麼會產生這樣的錯誤呢?

我搜尋下得到的結果是: 這個是2023年的結果,我這個是採用的php5.4版本的,暫時還是有這個問題的,文中也給了變相實現陣列屬性的方法,通過在建構函式裡面實現。

php_method(myclass, __construct)
這種實現的方式對應的php**

class

myclass

}

歡迎交流

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

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

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

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

執行環境 php7.0以上版本和以下版本建立流程和使用的函式可能會有些差異 第一步,先生成乙個擴充套件骨架 cd php 7.1.10 cd ext ext skel extname clas tension vim clas tension config.m4去掉前面的dnl dnl php ar...