文字列処理は私たちにとって一般的に使用される操作であり、zend は文字列操作に関連する多くのマクロをカプセル化します。まず、ZVAL_STRING と ZVAL_STRINGL を見てみましょう。なぜなら、PHP 内の多くの文字列操作 (substr など) は最終的に次のようになります。マクロは操作に使用されるため、ここでこれら 2 つのマクロを理解することが非常に重要です。
ZVAL_STRINGL 処理時に長さパラメータが与えられるため、文字列の長さを調べるために strlen を使用する必要がなくなり、パフォーマンスが向上します。
一般的に使用される Zend API については、以前にも触れたはずですが、PHP 拡張機能を開発する場合は、カプセル化されたシステム関数を使用するようにしてください。これにより、メモリが最適化され、メモリ リークなどのリスクが軽減されます。 e* が開発した関数については、過去の関連記事をご覧ください。
estrndup定義
<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>
_estrndup定義
<code><span>#define estrndup(s, length) _estrndup((s), (length) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)</span></code>
_emallocなどの関連する関数定義を自分で検索することができます。
上記では、PHP 拡張機能の開発ノート (6) ZVAL_STRING と ZVAL_STRINGL を、関連する内容も含めて紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。