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

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

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

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

初始化一個(gè)類非常容易,例如下面的代碼
MYCLASS_PROTERTY_* 這個(gè)相關(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>

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

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


/* 對(duì)應(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代碼變異的時(shí)候并沒(méi)有發(fā)現(xiàn)什么問(wèn)題,在執(zhí)行 new MyClass() 的時(shí)候就出現(xiàn)問(wèn)題了,報(bào)錯(cuò)如下:

<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)我們?cè)谡{(diào)用zend_register_internal_class的時(shí)候,myclass_ce 已經(jīng)初始化為ZEND_INTERNAL_CLASS了,而此時(shí)的zend_declare_property的myArray參數(shù)則是IS_ARRAY類型的,所以產(chǎn)生了這樣的錯(cuò)誤。

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

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

這種實(shí)現(xiàn)的方式對(duì)應(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擴(kuò)展開(kāi)發(fā)筆記(1)創(chuàng)建類的數(shù)組屬性,包括了方面的內(nèi)容,希望對(duì)PHP教程有興趣的朋友有所幫助。

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

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

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門(mén)話題

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

在使用PHP編寫(xiě)代碼時(shí),我們可能會(huì)遇到“Notice:Undefinedproperty”這個(gè)錯(cuò)誤提示。這個(gè)錯(cuò)誤提示意味著我們正在訪問(wèn)一個(gè)未定義的屬性,通常是因?yàn)樵搶傩栽诖a中尚未被初始化。那么,該如何解決這個(gè)問(wèn)題呢?下面是幾種可能的解決方法:初始化屬性這是解決該問(wèn)題的最簡(jiǎn)單方法。在代碼中顯式地初始化屬性,可以確保它在使用前已經(jīng)被定義。例如:class

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

oracle declare用法有變量聲明、常量聲明、游標(biāo)聲明和子程序聲明。詳細(xì)介紹:1、變量聲明,在PL/SQL塊中,可以使用DECLARE語(yǔ)句聲明變量;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開(kāi)發(fā)過(guò)程中,我們可能會(huì)遇到一個(gè)常見(jiàn)的錯(cuò)誤提示:Tryingtogetpropertyofnon-object(試圖獲取非對(duì)象的屬性)。這個(gè)錯(cuò)誤通常是由我們對(duì)一個(gè)非對(duì)象類型的變量嘗試訪問(wèn)屬性(或調(diào)用方法)時(shí)引起的。這篇文章將向你介紹這

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

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

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

如何在Zend框架中使用ACL(AccessControlList)進(jìn)行權(quán)限控制導(dǎo)言:在一個(gè)Web應(yīng)用程序中,權(quán)限控制是至關(guān)重要的一項(xiàng)功能。它可以確保用戶只能訪問(wèn)其有權(quán)訪問(wèn)的頁(yè)面和功能,并防止未經(jīng)授權(quán)的訪問(wèn)。Zend框架提供了一種方便的方法來(lái)實(shí)現(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框架。在開(kāi)發(fā)過(guò)程中,我們可能會(huì)遇到各種錯(cuò)誤和異常。其中一個(gè)常見(jiàn)的錯(cuò)誤是"TypeError:Cannotreadproperty'XXX'ofnull"。在本文中,我們將探討這個(gè)錯(cuò)誤的原因以及如何解決它。首先,讓我們來(lái)了解一下這個(gè)錯(cuò)誤的背后原因。當(dāng)我們嘗試訪問(wèn)一個(gè)對(duì)象的屬性或方法時(shí),如果該對(duì)

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,該怎么辦?對(duì)于使用Vue開(kāi)發(fā)的前端開(kāi)發(fā)者來(lái)說(shuō),可能在開(kāi)發(fā)過(guò)程中經(jīng)常遇到TypeError:Cannotreadproperty'XXX'ofundefined的錯(cuò)誤。這個(gè)錯(cuò)誤通常出現(xiàn)在嘗試訪問(wèn)一個(gè)未定義(undefined)的屬性時(shí)。在

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

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

See all articles