Entwicklungshinweise zur PHP-Erweiterung (6) ZVAL_STRING und ZVAL_STRINGL

WBOY
Freigeben: 2016-08-08 09:22:36
Original
1742 Leute haben es durchsucht

String-Verarbeitung ist für uns eine gängige Operation, und Zend kapselt viele Makros im Zusammenhang mit String-Operationen. Schauen wir uns zunächst ZVAL_STRING und ZVAL_STRINGL an.

<code><span>#define ZVAL_STRING(z, s, duplicate) do {   \</span><span>const</span><span>char</span> *__s=(s);                \
         zval *__z = (z);                    \
         Z_STRLEN_P(__z) = <span>strlen</span>(__s);      \
         Z_STRVAL_P(__z) = (duplicate?estrndup(__s, Z_STRLEN_P(__z)):(<span>char</span>*)__s);\
         Z_TYPE_P(__z) = IS_STRING;          \
     } <span>while</span> (<span>0</span>)

 <span>#define ZVAL_STRINGL(z, s, l, duplicate) do {   \</span><span>const</span><span>char</span> *__s=(s); <span>int</span> __l=l;         \
         zval *__z = (z);                        \
         Z_STRLEN_P(__z) = __l;                  \
         Z_STRVAL_P(__z) = (duplicate?estrndup(__s, __l):(<span>char</span>*)__s);\
         Z_TYPE_P(__z) = IS_STRING;              \
     } <span>while</span> (<span>0</span>)</code>
Nach dem Login kopieren

Weil es viele String-Operationen gibt Innerhalb von PHP (z. B. substr) werden schließlich solche Makros für den Betrieb bereitgestellt, daher ist es hier sehr wichtig, diese beiden Makros zu verstehen.

Wenn ZVAL_STRINGL verarbeitet wird, ist es nicht erforderlich, strlen zum Ermitteln der Länge der Zeichenfolge zu verwenden, da der Längenparameter angegeben ist, und die Leistung wird verbessert.

Wie bereits erwähnt, ist estrndup auch in der PHP-Erweiterung gekapselt. Versuchen Sie, systemgekapselte Funktionen zu verwenden, die den Speicher optimieren und Speicherverluste reduzieren können Von e* entwickelte Funktionen. Sie können frühere verwandte Artikel lesen.

estrndup-Definition

<code><span>#define estrndup(s, length) _estrndup((s), (length) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)</span></code>
Nach dem Login kopieren

_estrndup-Definition

<code> ZEND_API <span>char</span> *_estrndup(<span>const</span><span>char</span> *s, uint length ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
 {
     <span>char</span> *p;
 <span>#ifdef ZEND_SIGNALS</span>
     TSRMLS_FETCH();
 <span>#endif</span>     HANDLE_BLOCK_INTERRUPTIONS();

     p = (<span>char</span> *) _emalloc(length+<span>1</span> ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
     <span>if</span> (UNEXPECTED(p == NULL)) {
         HANDLE_UNBLOCK_INTERRUPTIONS();
         <span>return</span> p;
     }
     <span>memcpy</span>(p, s, length);
     p[length] = <span>0</span>;
     HANDLE_UNBLOCK_INTERRUPTIONS();
     <span>return</span> p;
 }</code>
Nach dem Login kopieren

Sie können selbst nach verwandten Funktionsdefinitionen wie _emalloc suchen.

Das Obige stellt die PHP-Erweiterungsentwicklungshinweise (6) ZVAL_STRING und ZVAL_STRINGL vor, einschließlich relevanter Inhalte. Ich hoffe, dass es für Freunde hilfreich ist, die an PHP-Tutorials interessiert sind.

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage