Heim >Backend-Entwicklung >PHP-Tutorial >Entwicklungshinweise zur PHP-Erweiterung (1) Erstellen Sie Array-Attribute von Klassen

Entwicklungshinweise zur PHP-Erweiterung (1) Erstellen Sie Array-Attribute von Klassen

WBOY
WBOYOriginal
2016-08-08 09:23:261519Durchsuche

Es ist sehr einfach, eine Klasse zu initialisieren, wie zum Beispiel den folgenden Code
MYCLASS_PROTERTY_* Dies hängt mit der definierten Makrozeichenfolge zusammen

<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>

Die oben genannten Codes sind einige einfache Eigenschaften.
Beim Versuch, die Attribute eines Arrays für die Klasse myclass zu initialisieren, ist der Code für PHP wie folgt fehlgeschlagen:

<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>

Bei der Ausführung des neuen C-Codes wurde kein Problem gefunden Wenn MyClass() aufgetreten ist, lautet der Fehler wie folgt:

<code>Internal zval<span>'s</span> can<span>'t</span> be arrays, objects <span>or</span> resources</code>

Ein Blick auf den Quellcode von Zend lautet wie folgt:

<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>

Wenn wir zend_register_internal_class aufrufen, wurde myclass_ce initialisiert Es ist ZEND_INTERNAL_CLASS und der myArray-Parameter von zend_declare_property ist derzeit vom Typ IS_ARRAY, sodass ein solcher Fehler auftritt.

Warum tritt ein solcher Fehler auf?

Das Ergebnis meiner Suche ist: http://grokbase.com/t/php/php-internals/07a4b14xvb/php-dev-how-declare-protected-array-property-at-internal - Klassenrichtig Dies ist das Ergebnis von 2007. Ich verwende die PHP5.4-Version und habe vorerst immer noch dieses Problem. Der Artikel enthält auch eine Methode zum getarnten Implementieren von Array-Eigenschaften, indem sie im Konstruktor implementiert wird .

<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>

Der PHP-Code, der dieser Implementierungsmethode entspricht

<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>

Das Obige stellt die Entwicklungsnotizen zur PHP-Erweiterung vor (1) Array-Attribute der erstellten Klasse, einschließlich des Inhalts Ich hoffe, es wird für Freunde hilfreich sein, die sich für PHP-Tutorials interessieren.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Mongodb-StandortsucheNächster Artikel:Mongodb-Standortsuche