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

首頁(yè) 後端開(kāi)發(fā) php教程 php擴(kuò)充開(kāi)發(fā)筆記(1)建立類別的陣列屬性

php擴(kuò)充開(kāi)發(fā)筆記(1)建立類別的陣列屬性

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í)候,失敗了,相對(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所以產(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è)是採(cǎi)用的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í)作的方式對(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)建類別的陣列屬性,包含了方面的內(nèi)容,希望對(duì)PHP教學(xué)有興趣的朋友有幫助。

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)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脫衣器

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ò)誤提示意味著我們正在存取一個(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用法有變數(shù)宣告、常數(shù)宣告、遊標(biāo)宣告和子程式宣告。詳細(xì)介紹:1、變數(shù)聲明,在PL/SQL區(qū)塊中,可以使用DECLARE語(yǔ)句聲明變數(shù);2、常數(shù)是在PL/SQL區(qū)塊中聲明的不可更改的值;3、遊標(biāo)聲明,用於在PL/SQL在區(qū)塊中處理查詢結(jié)果集;4、子程序聲明,子程序是在PL/SQL區(qū)塊中定義的可重複使用的程式碼區(qū)塊。

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(試圖取得非物件的屬性)。這個(gè)錯(cuò)誤通常是由我們對(duì)一個(gè)非物件類型的變數(shù)嘗試存取屬性(或呼叫方法)時(shí)引起的。這篇文章將向你介紹這

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

PHP實(shí)作框架:ZendFramework入門(mén)教學(xué)ZendFramework是PHP開(kāi)發(fā)的開(kāi)源網(wǎng)站框架,目前由ZendTechnologies維護(hù),ZendFramework採(cǎi)用了MVC設(shè)計(jì)模式,提供了一系列可重複使用的程式碼庫(kù),服務(wù)於實(shí)作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)重要的功能。它可以確保使用者只能存取其有權(quán)存取的頁(yè)面和功能,並防止未經(jīng)授權(quán)的存取。 Zend框架提供了一種方便的方法來(lái)實(shí)現(xiàn)權(quá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框架。在開(kāi)發(fā)過(guò)程中,我們可能會(huì)遇到各種錯(cuò)誤和異常。其中一個(gè)常見(jiàn)的錯(cuò)誤是"TypeError:Cannotreadproperty'XXX'ofnull"。在本文中,我們將探討這個(gè)錯(cuò)誤的原因以及如何解決它。首先,讓我們來(lái)了解這個(gè)錯(cuò)誤背後的原因。當(dāng)我們嘗試存取一個(gè)物件的屬性或方法時(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)在嘗試存取一個(gè)未定義(undefined)的屬性時(shí)。在

PHP無(wú)法辨識(shí)ZendOptimizer,如何解決? PHP無(wú)法辨識(shí)ZendOptimizer,如何解決? Mar 19, 2024 pm 01:09 PM

PHP無(wú)法辨識(shí)ZendOptimizer,如何解決?在PHP開(kāi)發(fā)中,有時(shí)可能會(huì)遇到PHP無(wú)法辨識(shí)ZendOptimizer的情況,這會(huì)導(dǎo)致部分PHP程式碼無(wú)法正常運(yùn)作。在這種情況下,我們需要採(cǎi)取一些措施來(lái)解決這個(gè)問(wèn)題。以下將介紹一些可能的解決方法,並附上具體的程式碼範(fàn)例。 1.確認(rèn)ZendOptimizer是否正確安裝:首先,我們需要確認(rèn)ZendOptimize

See all articles