国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 后端開發(fā) php教程 php擴展開發(fā)筆記(1)創(chuàng)建類的數(shù)組屬性

php擴展開發(fā)筆記(1)創(chuàng)建類的數(shù)組屬性

Aug 08, 2016 am 09:23 AM
declare property zend

初始化一個類非常容易,例如下面的代碼
MYCLASS_PROTERTY_* 這個相關(guān)是 define 的宏字符串

<code>zend_class_entry *myclass_ce;

zend_function_entry myclass_methods[] = {
    PHP_FE_END
};

PHP_MINIT_FUNCTION(myext)
{

    zend_class_entry ce;

    INIT_CLASS_ENTRY(ce, <span>"MyClass"</span>, myclass_methods);
    myclass_ce = zend_register_internal_class(&ce TSRMLS_CC);

    zend_<span>declare</span>_class_constant_string(myclass_ce, ZEND_STRL(MYCLASS_PROTERTY_NAME_VERSION), PHP_SLIM_VERSION);
    zend_<span>declare</span>_property_null(myclass_ce, ZEND_STRL(MYCLASS_PROTERTY_NAME_CONTAINER), ZEND_ACC_PUBLIC TSRMLS_CC);
    zend_<span>declare</span>_property_null(myclass_ce, ZEND_STRL(MYCLASS_PROTERTY_NAME_APPS), ZEND_ACC_STATIC|ZEND_ACC_PROTECTED TSRMLS_CC);
    zend_<span>declare</span>_property_null(myclass_ce, ZEND_STRL(MYCLASS_PROTERTY_NAME_NAME), ZEND_ACC_PROTECTED TSRMLS_CC);
    zend_<span>declare</span>_property_null(myclass_ce, ZEND_STRL(MYCLASS_PROTERTY_NAME_ERROR), ZEND_ACC_PROTECTED TSRMLS_CC);
    zend_<span>declare</span>_property_null(myclass_ce, ZEND_STRL(MYCLASS_PROTERTY_NAME_NOTFOUND), ZEND_ACC_PROTECTED TSRMLS_CC);
    zend_<span>declare</span>_property_null(myclass_ce, ZEND_STRL(MYCLASS_PROTERTY_NAME_MIDDLEWARE), ZEND_ACC_PROTECTED TSRMLS_CC);

    <span>return</span> SUCCESS;
}</code>

以上的代碼都是一些簡單的屬性。
當(dāng)想要給myclass這個類初始化一個數(shù)組的屬性的時候,失敗了,相對于php的代碼如下

<code><span><span>class</span><span>MyClass</span> {
    public $myArray = array<span>()</span>;
}


/* 對應(yīng)的<span>C</span>代碼 */

zval *myArray;
<span>MAKE_STD_ZVAL</span><span>(<span>myArray</span>)</span>;
array_init<span>(<span>myArray</span>)</span>;

zend_declare_property<span>(<span>myclass_ce</span>, <span>ZEND_STRL(MYCLASS_PROTERTY_NAME_MYCLASS)</span>, <span>myArray</span>, <span>ZEND_ACC_PUBLIC</span><span>TSRMLS_CC</span>)</span>;</span></code>

上面這段C代碼變異的時候并沒有發(fā)現(xiàn)什么問題,在執(zhí)行 new MyClass() 的時候就出現(xiàn)問題了,報錯如下:

<code>Internal zval<span>'s</span> can<span>'t</span> be arrays, objects <span>or</span> resources</code>

翻看zend的源代碼如下:

<code><span>if</span> (ce-><span><span>type</span> & <span>ZEND_INTERNAL_CLASS</span>) <span>{
     <span>switch</span>(<span>Z_TYPE_P(property)</span>) {
         <span>case</span><span>IS_ARRAY</span>:
         <span>case</span><span>IS_CONSTANT_ARRAY</span>:
         <span>case</span><span>IS_OBJECT</span>:
         <span>case</span><span>IS_RESOURCE</span>:
             <span>zend_error</span>(<span>E_CORE_ERROR</span>, "<span>Internal</span><span>zval's</span><span>can't</span><span>be</span><span>arrays</span>, <span>objects</span><span>or</span><span>resources</span>");
             <span>break</span>;
         <span>default</span>:
             <span>break</span>;
     }</span></span>
 }</code>

當(dāng)我們在調(diào)用zend_register_internal_class的時候,myclass_ce 已經(jīng)初始化為ZEND_INTERNAL_CLASS了,而此時的zend_declare_property的myArray參數(shù)則是IS_ARRAY類型的,所以產(chǎn)生了這樣的錯誤。

為什么會產(chǎn)生這樣的錯誤呢?

我搜索下得到的結(jié)果是:http://grokbase.com/t/php/php-internals/07a4b14xvb/php-dev-how-declare-protected-array-property-at-internal-class-properly 這個是2007年的結(jié)果,我這個是采用的php5.4版本的,暫時還是有這個問題的,文中也給了變相實現(xiàn)數(shù)組屬性的方法,通過在構(gòu)造函數(shù)里面實現(xiàn)。

<code>PHP_METHOD(myclass, __construct) {
    zval <span>*apps</span>, <span>*pThis</span>;
    pThis = getThis();
    MAKE_STD_ZVAL(apps);
    array_init(apps);
    add_property_zval_ex(pThis, ZEND_STRL(SLIM_SLIM_PROTERTY_NAME_APPS), apps);
}</code>

這種實現(xiàn)的方式對應(yīng)的php代碼

<code><span><span>class</span><span>MyClass</span> {</span><span><span>function</span><span>__construct</span><span>()</span> {</span><span>$this</span>->app = <span>array</span>();  
    }
}</code>

以上就介紹了php擴展開發(fā)筆記(1)創(chuàng)建類的數(shù)組屬性,包括了方面的內(nèi)容,希望對PHP教程有興趣的朋友有所幫助。

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

PHP Notice: Undefined property: 的解決方法 PHP Notice: Undefined property: 的解決方法 Jun 22, 2023 pm 02:48 PM

在使用PHP編寫代碼時,我們可能會遇到“Notice:Undefinedproperty”這個錯誤提示。這個錯誤提示意味著我們正在訪問一個未定義的屬性,通常是因為該屬性在代碼中尚未被初始化。那么,該如何解決這個問題呢?下面是幾種可能的解決方法:初始化屬性這是解決該問題的最簡單方法。在代碼中顯式地初始化屬性,可以確保它在使用前已經(jīng)被定義。例如:class

oracle declare用法有哪些 oracle declare用法有哪些 Sep 15, 2023 pm 01:12 PM

oracle declare用法有變量聲明、常量聲明、游標(biāo)聲明和子程序聲明。詳細介紹:1、變量聲明,在PL/SQL塊中,可以使用DECLARE語句聲明變量;2、常量是在PL/SQL塊中聲明的不可更改的值;3、游標(biāo)聲明,用于在PL/SQL塊中處理查詢結(jié)果集;4、子程序聲明,子程序是在PL/SQL塊中定義的可重用的代碼塊。

PHP Notice: Trying to get property of non-object - 解決方法 PHP Notice: Trying to get property of non-object - 解決方法 Aug 17, 2023 am 09:27 AM

PHPNotice:Tryingtogetpropertyofnon-object-解決方法在PHP開發(fā)過程中,我們可能會遇到一個常見的錯誤提示:Tryingtogetpropertyofnon-object(試圖獲取非對象的屬性)。這個錯誤通常是由我們對一個非對象類型的變量嘗試訪問屬性(或調(diào)用方法)時引起的。這篇文章將向你介紹這

PHP實現(xiàn)框架:Zend Framework入門教程 PHP實現(xiàn)框架:Zend Framework入門教程 Jun 19, 2023 am 08:09 AM

PHP實現(xiàn)框架:ZendFramework入門教程ZendFramework是PHP開發(fā)的一種開源網(wǎng)站框架,目前由ZendTechnologies維護,ZendFramework采用了MVC設(shè)計模式,提供了一系列可重用的代碼庫,服務(wù)于實現(xiàn)Web2.0應(yīng)用程序和Web服務(wù)。ZendFramework深受PHP開發(fā)者的歡迎和推崇,擁有廣泛

如何在Zend框架中使用ACL(Access Control List)進行權(quán)限控制 如何在Zend框架中使用ACL(Access Control List)進行權(quán)限控制 Jul 29, 2023 am 09:24 AM

如何在Zend框架中使用ACL(AccessControlList)進行權(quán)限控制導(dǎo)言:在一個Web應(yīng)用程序中,權(quán)限控制是至關(guān)重要的一項功能。它可以確保用戶只能訪問其有權(quán)訪問的頁面和功能,并防止未經(jīng)授權(quán)的訪問。Zend框架提供了一種方便的方法來實現(xiàn)權(quán)限控制,即使用ACL(AccessControlList)組件。本文將介紹如何在Zend框架中使用ACL

Vue中的TypeError: Cannot read property 'XXX' of null,應(yīng)該怎么辦? Vue中的TypeError: Cannot read property 'XXX' of null,應(yīng)該怎么辦? Nov 25, 2023 pm 01:21 PM

Vue是一種流行的用于構(gòu)建用戶界面的JavaScript框架。在開發(fā)過程中,我們可能會遇到各種錯誤和異常。其中一個常見的錯誤是"TypeError:Cannotreadproperty'XXX'ofnull"。在本文中,我們將探討這個錯誤的原因以及如何解決它。首先,讓我們來了解一下這個錯誤的背后原因。當(dāng)我們嘗試訪問一個對象的屬性或方法時,如果該對

Vue中的TypeError: Cannot read property 'XXX' of undefined,該怎么辦? Vue中的TypeError: Cannot read property 'XXX' of undefined,該怎么辦? Nov 25, 2023 am 10:56 AM

Vue中的TypeError:Cannotreadproperty'XXX'ofundefined,該怎么辦?對于使用Vue開發(fā)的前端開發(fā)者來說,可能在開發(fā)過程中經(jīng)常遇到TypeError:Cannotreadproperty'XXX'ofundefined的錯誤。這個錯誤通常出現(xiàn)在嘗試訪問一個未定義(undefined)的屬性時。在

Oracle中declare如何使用 Oracle中declare如何使用 Sep 19, 2023 am 09:44 AM

DECLARE語句是Oracle中用于聲明變量、常量和游標(biāo)的關(guān)鍵字。提供了一種方便的方式來定義和初始化在PL/SQL塊中使用的數(shù)據(jù)對象。通過使用DECLARE語句,可以使PL/SQL代碼更加模塊化和可讀性更強 。

See all articles