php擴(kuò)展開發(fā)筆記(1)創(chuàng)建類的數(shù)組屬性
Aug 08, 2016 am 09:23 AM初始化一個(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í)候并沒有發(fā)現(xiàn)什么問題,在執(zhí)行 new MyClass() 的時(shí)候就出現(xià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è)問題的,文中也給了變相實(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ò)展開發(fā)筆記(1)創(chuàng)建類的數(shù)組屬性,包括了方面的內(nèi)容,希望對(duì)PHP教程有興趣的朋友有所幫助。

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Lors de l'écriture de code en PHP, nous pouvons rencontrer le message d'erreur ??Avis : Propriété non définie??. Cette erreur signifie que nous accédons à une propriété non définie, généralement parce que la propriété n'a pas été initialisée dans le code. Alors, comment résoudre ce problème ? Voici quelques solutions possibles : Initialiser les propriétés C'est la manière la plus simple de résoudre ce problème. L'initialisation explicite d'une propriété dans le code garantit qu'elle est définie avant utilisation. Par exemple?: classe

L'utilisation de la déclaration Oracle comprend la déclaration de variable, la déclaration de constante, la déclaration de curseur et la déclaration de sous-programme. Introduction détaillée?: 1. Déclaration de variable, dans le bloc PL/SQL, vous pouvez utiliser l'instruction DECLARE pour déclarer des variables?; 2. Les constantes sont des valeurs non modifiables déclarées dans le bloc PL/SQL 3. Déclaration de curseur, utilisée dans PL/SQL?; L'ensemble des résultats de la requête est traité dans le bloc?; 4. Déclaration de sous-programme. Un sous-programme est un bloc de code réutilisable défini dans un bloc PL/SQL.

Avis PHP?: Tryingtogetpropertyofnon-object-Solution Au cours du processus de développement PHP, nous pouvons rencontrer un message d'erreur courant?: Tryingtogetpropertyofnon-object (tentative d'obtenir la propriété d'un non-objet). Cette erreur se produit généralement lorsque nous essayons d'accéder à une propriété (ou d'appeler une méthode) sur une variable qui n'est pas un type d'objet. Cet article va vous présenter ceci

Framework d'implémentation PHP?: tutoriel d'introduction à ZendFramework ZendFramework est un framework de site Web open source développé par PHP et actuellement maintenu par ZendTechnologies. ZendFramework adopte le modèle de conception MVC et fournit une série de bibliothèques de code réutilisables pour servir l'implémentation d'applications Web2.0 et Web Serve. ZendFramework est très populaire et respecté par les développeurs PHP et propose une large gamme de

Comment utiliser l'ACL (AccessControlList) pour le contr?le des autorisations dans Zend Framework Introduction : Dans une application Web, le contr?le des autorisations est une fonction cruciale. Il garantit que les utilisateurs ne peuvent accéder qu'aux pages et fonctionnalités auxquelles ils sont autorisés à accéder et empêche tout accès non autorisé. Le framework Zend fournit un moyen pratique d'implémenter le contr?le des autorisations, en utilisant le composant ACL (AccessControlList). Cet article explique comment utiliser l'ACL dans Zend Framework.

Vue est un framework JavaScript populaire pour créer des interfaces utilisateur. Au cours du processus de développement, nous pouvons rencontrer diverses erreurs et exceptions. L’une des erreurs courantes est ? TypeError:Cannotreadproperty'XXX'ofnull ?. Dans cet article, nous explorerons les causes de cette erreur et comment y remédier. Tout d’abord, comprenons la raison de cette erreur. Lorsque nous essayons d'accéder à une propriété ou à une méthode d'un objet, si la paire

TypeError:Cannotreadproperty'XXX'ofundefined dans Vue, que dois-je faire ? Pour les développeurs front-end qui utilisent Vue pour développer, ils peuvent souvent rencontrer des erreurs TypeError:Cannotreadproperty'XXX'ofundéfini pendant le processus de développement. Cette erreur se produit généralement lorsque vous tentez d'accéder à une propriété non définie. exister

PHP ne reconna?t pas ZendOptimizer, comment le résoudre ? Dans le développement PHP, vous pouvez parfois rencontrer une situation dans laquelle PHP ne peut pas reconna?tre ZendOptimizer, ce qui entra?nera un mauvais fonctionnement de certains codes PHP. Dans ce cas, nous devons prendre certaines mesures pour résoudre le problème. Certaines solutions de contournement possibles sont décrites ci-dessous, ainsi que des exemples de code spécifiques. 1. Confirmez si ZendOptimizer est installé correctement : Tout d'abord, nous devons confirmer que ZendOptimizer
