国产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_* 這個相關是 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>

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

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


/* 對應的<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>

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

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

我搜索下得到的結果是:http://grokbase.com/t/php/php-internals/07a4b14xvb/php-dev-how-declare-protected-array-property-at-internal-class-properly 這個是2007年的結果,我這個是采用的php5.4版本的,暫時還是有這個問題的,文中也給了變相實現(xiàn)數(shù)組屬性的方法,通過在構造函數(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)的方式對應的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ù)組屬性,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅動的應用程序,用于創(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用法有變量聲明、常量聲明、游標聲明和子程序聲明。詳細介紹:1、變量聲明,在PL/SQL塊中,可以使用DECLARE語句聲明變量;2、常量是在PL/SQL塊中聲明的不可更改的值;3、游標聲明,用于在PL/SQL塊中處理查詢結果集;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(試圖獲取非對象的屬性)。這個錯誤通常是由我們對一個非對象類型的變量嘗試訪問屬性(或調用方法)時引起的。這篇文章將向你介紹這

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設計模式,提供了一系列可重用的代碼庫,服務于實現(xiàn)Web2.0應用程序和Web服務。ZendFramework深受PHP開發(fā)者的歡迎和推崇,擁有廣泛

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

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

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

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

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)的屬性時。在

PHP無法識別ZendOptimizer,如何解決? PHP無法識別ZendOptimizer,如何解決? Mar 19, 2024 pm 01:09 PM

PHP無法識別ZendOptimizer,如何解決?在PHP開發(fā)中,有時可能會遇到PHP無法識別ZendOptimizer的情況,這會導致部分PHP代碼無法正常運行。在這種情況下,我們需要采取一些措施來解決這個問題。下面將介紹一些可能的解決方法,并附上具體的代碼示例。1.確認ZendOptimizer是否正確安裝:首先,我們需要確認ZendOptimize

See all articles