Maison développement back-end tutoriel php php扩展开发笔记(1)创建类的数组属性

php扩展开发笔记(1)创建类的数组属性

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>
Copier après la connexion

以上的代码都是一些简单的属性。
当想要给myclass这个类初始化一个数组的属性的时候,失败了,相对于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>
Copier après la connexion

上面这段C代码变异的时候并没有发现什么问题,在执行 new MyClass() 的时候就出现问题了,报错如下:

<code>Internal zval<span>'s</span> can<span>'t</span> be arrays, objects <span>or</span> resources</code>
Copier après la connexion

翻看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>
Copier après la connexion

当我们在调用zend_register_internal_class的时候,myclass_ce 已经初始化为ZEND_INTERNAL_CLASS了,而此时的zend_declare_property的myArray参数则是IS_ARRAY类型的,所以产生了这样的错误。

为什么会产生这样的错误呢?

我搜索下得到的结果是:http://grokbase.com/t/php/php-internals/07a4b14xvb/php-dev-how-declare-protected-array-property-at-internal-class-properly 这个是2007年的结果,我这个是采用的php5.4版本的,暂时还是有这个问题的,文中也给了变相实现数组属性的方法,通过在构造函数里面实现。

<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>
Copier après la connexion

这种实现的方式对应的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>
Copier après la connexion

以上就介绍了php扩展开发笔记(1)创建类的数组属性,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Où trouver la courte de la grue à atomide atomique
1 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Avis PHP : Essayer d'obtenir la propriété d'un non-objet - Solution Avis PHP : Essayer d'obtenir la propriété d'un non-objet - Solution Aug 17, 2023 am 09:27 AM

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

Quelles sont les utilisations d'Oracle Statement Quelles sont les utilisations d'Oracle Statement Sep 15, 2023 pm 01:12 PM

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.

Solution à l'avis PHP : propriété non définie : Solution à l'avis PHP : propriété non définie : Jun 22, 2023 pm 02:48 PM

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

TypeError : Impossible de lire la propriété « XXX » de null dans Vue, que dois-je faire ? TypeError : Impossible de lire la propriété « XXX » de null dans Vue, que dois-je faire ? Nov 25, 2023 pm 01:21 PM

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

Comment utiliser l'ACL (Access Control List) pour le contrôle des autorisations dans Zend Framework Comment utiliser l'ACL (Access Control List) pour le contrôle des autorisations dans Zend Framework Jul 29, 2023 am 09:24 AM

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.

Framework d'implémentation PHP : Tutoriel de mise en route de Zend Framework Framework d'implémentation PHP : Tutoriel de mise en route de Zend Framework Jun 19, 2023 am 08:09 AM

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

TypeError : Impossible de lire la propriété '$XXX' de non définie dans Vue, quelles sont les solutions ? TypeError : Impossible de lire la propriété '$XXX' de non définie dans Vue, quelles sont les solutions ? Nov 25, 2023 am 10:00 AM

TypeError:Cannotreadproperty'$XXX'ofundefined dans Vue, quelles sont les solutions ? Dans le développement de Vue, des erreurs telles que TypeError:Cannotreadproperty'$XXX'ofundefined sont souvent rencontrées. Cette erreur est généralement causée par l'utilisation de propriétés ou de méthodes non définies dans l'instance Vue. Lorsque cette erreur se produit, nous devons

TypeError : Impossible de lire la propriété « XXX » de non définie dans Vue, que dois-je faire ? TypeError : Impossible de lire la propriété « XXX » de non définie dans Vue, que dois-je faire ? Nov 25, 2023 am 10:56 AM

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

See all articles