初始化乙個類非常容易,例如下面的**
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...