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

Rumah pembangunan bahagian belakang tutorial 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>

以上的代碼都是一些簡單的屬性。
當想要給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>

當我們在調(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教程有興趣的朋友有所幫助。

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Penyelesaian kepada Notis PHP: Harta yang tidak ditentukan: Penyelesaian kepada Notis PHP: Harta yang tidak ditentukan: Jun 22, 2023 pm 02:48 PM

Semasa menulis kod dalam PHP, kami mungkin menghadapi mesej ralat "Notis: Undefinedproperty". Ralat ini bermakna kami sedang mengakses sifat yang tidak ditentukan, biasanya kerana sifat tersebut belum dimulakan dalam kod. Jadi, bagaimana untuk menyelesaikan masalah ini? Berikut ialah beberapa penyelesaian yang mungkin: Mulakan sifat Ini adalah cara paling mudah untuk menyelesaikan masalah ini. Memulakan sifat dalam kod secara eksplisit memastikan ia ditakrifkan sebelum digunakan. Contohnya: kelas

Apakah kegunaan oracle declare Apakah kegunaan oracle declare Sep 15, 2023 pm 01:12 PM

Penggunaan pengisytiharan Oracle termasuk pengisytiharan berubah-ubah, pengisytiharan malar, pengisytiharan kursor dan pengisytiharan subrutin. Pengenalan terperinci: 1. Pengisytiharan pembolehubah, dalam blok PL/SQL, anda boleh menggunakan pernyataan DECLARE untuk mengisytiharkan pembolehubah; set hasil pertanyaan diproses dalam blok; 4. Pengisytiharan subrutin ialah blok kod boleh guna semula yang ditakrifkan dalam blok PL/SQL.

Notis PHP: Mencuba untuk mendapatkan harta bukan objek - Penyelesaian Notis PHP: Mencuba untuk mendapatkan harta bukan objek - Penyelesaian Aug 17, 2023 am 09:27 AM

Notis PHP: Tryingtogetpropertyofnon-object-Solution Semasa proses pembangunan PHP, kita mungkin menghadapi mesej ralat biasa: Tryingtogetpropertyofnon-object (cuba mendapatkan sifat bukan objek). Ralat ini biasanya disebabkan apabila kita cuba mengakses harta (atau memanggil kaedah) pada pembolehubah yang bukan jenis objek. Artikel ini akan memperkenalkan anda kepada ini

Rangka Kerja Pelaksanaan PHP: Tutorial Permulaan Rangka Kerja Zend Rangka Kerja Pelaksanaan PHP: Tutorial Permulaan Rangka Kerja Zend Jun 19, 2023 am 08:09 AM

Rangka kerja pelaksanaan PHP: Tutorial pengenalan ZendFramework ZendFramework ialah rangka kerja tapak web sumber terbuka yang dibangunkan oleh PHP dan kini diselenggara oleh ZendTechnologies menggunakan corak reka bentuk MVC dan menyediakan satu siri perpustakaan kod boleh guna semula untuk melaksanakan aplikasi Web2.0 dan Web Serve. ZendFramework sangat popular dan dihormati oleh pembangun PHP dan mempunyai pelbagai jenis

Cara menggunakan ACL (Senarai Kawalan Akses) untuk kawalan kebenaran dalam Rangka Kerja Zend Cara menggunakan ACL (Senarai Kawalan Akses) untuk kawalan kebenaran dalam Rangka Kerja Zend Jul 29, 2023 am 09:24 AM

Cara menggunakan ACL (AccessControlList) untuk kawalan kebenaran dalam Rangka Kerja Zend Pengenalan: Dalam aplikasi web, kawalan kebenaran ialah fungsi penting. Ia memastikan bahawa pengguna hanya boleh mengakses halaman dan ciri yang dibenarkan untuk mereka akses dan menghalang akses yang tidak dibenarkan. Rangka kerja Zend menyediakan cara yang mudah untuk melaksanakan kawalan kebenaran, menggunakan komponen ACL (AccessControlList). Artikel ini akan memperkenalkan cara menggunakan ACL dalam Rangka Kerja Zend

TypeError: Tidak dapat membaca sifat 'XXX' null dalam Vue, apakah yang perlu saya lakukan? TypeError: Tidak dapat membaca sifat 'XXX' null dalam Vue, apakah yang perlu saya lakukan? Nov 25, 2023 pm 01:21 PM

Vue ialah rangka kerja JavaScript yang popular untuk membina antara muka pengguna. Semasa proses pembangunan, kami mungkin menghadapi pelbagai ralat dan pengecualian. Salah satu ralat biasa ialah "TypeError:Cannotreadproperty'XXX'ofnull". Dalam artikel ini, kami akan meneroka punca ralat ini dan cara membetulkannya. Pertama, mari kita fahami sebab di sebalik ralat ini. Apabila kita cuba mengakses harta atau kaedah objek, jika pasangan itu

TypeError: Tidak dapat membaca sifat 'XXX' undefined dalam Vue, apakah yang perlu saya lakukan? TypeError: Tidak dapat membaca sifat 'XXX' undefined dalam Vue, apakah yang perlu saya lakukan? Nov 25, 2023 am 10:56 AM

TypeError:Cannotreadproperty'XXX'ofudefined dalam Vue, apakah yang perlu saya lakukan? Bagi pembangun bahagian hadapan yang menggunakan Vue untuk membangunkan, mereka mungkin sering menghadapi ralat TypeError:Cannotreadproperty'XXX'fundefined semasa proses pembangunan. Ralat ini biasanya berlaku apabila cuba mengakses harta yang tidak ditentukan. wujud

PHP tidak mengenali ZendOptimizer, bagaimana untuk menyelesaikannya? PHP tidak mengenali ZendOptimizer, bagaimana untuk menyelesaikannya? Mar 19, 2024 pm 01:09 PM

PHP tidak mengenali ZendOptimizer, bagaimana untuk menyelesaikannya? Dalam pembangunan PHP, kadangkala anda mungkin menghadapi situasi di mana PHP tidak dapat mengenali ZendOptimizer, yang akan menyebabkan beberapa kod PHP tidak berjalan dengan betul. Dalam kes ini, kita perlu mengambil beberapa langkah untuk menyelesaikan masalah tersebut. Beberapa penyelesaian yang mungkin diterangkan di bawah, bersama dengan contoh kod khusus. 1. Sahkan sama ada ZendOptimizer dipasang dengan betul: Pertama, kita perlu mengesahkan bahawa ZendOptimizer

See all articles