ホームページ > バックエンド開発 > PHPチュートリアル > PHP 拡張機能開発ノート (5) 配列操作に関連するいくつかのマクロと簡単な例

PHP 拡張機能開発ノート (5) 配列操作に関連するいくつかのマクロと簡単な例

WBOY
リリース: 2016-08-08 09:22:47
オリジナル
1020 人が閲覧しました

同様の isset($array[$value]) 関数を実装するには、PHP コードは次のとおりです

<code><span><?php</span><span><span>class</span><span>Slash_Log</span> {</span><span>protected</span><span>static</span><span>$levels</span> = <span>array</span>(
        <span>1</span> => <span>"ERROR"</span>,
        <span>2</span> => <span>"WARNING"</span>,
        <span>3</span> => <span>"INFO"</span>,
        <span>4</span> => <span>"DEBUG"</span>,
    );

    <span>public</span><span><span>function</span><span>setLevel</span><span>(<span>$level</span>)</span> {</span><span>if</span> (!<span>isset</span>(<span>self</span>::<span>$levels</span>)) {
            <span>throw</span><span>new</span><span>Exception</span>(<span>"Level is not allowed"</span>);
        }
    }
}</span></code>
ログイン後にコピー

C コードは次のとおりです

<code>PHP_METHOD(slash_log, setLevel) {

    <span>long</span> level;
    zval *levels;
    zend_class_entry *ce;
    HashTable *levels_ht;

    ce = Z_OBJCE_P(getThis());
    <span>if</span> (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, <span>"l"</span>, &level) == FAILURE)
    {
        php_error_docref(NULL TSRMLS_CC, E_WARNING, <span>"Invalid argument"</span>);
        RETURN_FALSE;
    }

    levels = zend_read_static_property(ce, ZEND_STRL(SL_P_LEVELS), <span>0</span> TSRMLS_DC);
    levels_ht = Z_ARRVAL_P(levels);

    <span>if</span> (!zend_hash_index_exists(levels_ht, level)) {
        php_error_docref(NULL TSRMLS_CC, E_WARNING, <span>"Level is not allowed"</span>);
        RETURN_FALSE;
    }

    zend_update_property_long(ce, getThis(), ZEND_STRL(SL_P_LEVEL), level TSRMLS_CC);
    RETURN_TRUE;
}</code>
ログイン後にコピー

上記の例では、主に zend_hash_index_exists メソッドが使用されています Zend/ にはハッシュ テーブルを操作するための一連のメソッドがあります。 zend_hash.h

<code>ZEND_API <span>int</span> zend_hash_add_empty_element(HashTable *ht, <span>const</span><span>char</span> *arKey, uint nKeyLength);
ZEND_API <span>int</span> zend_hash_del_key_or_index(HashTable *ht, <span>const</span><span>char</span> *arKey, uint nKeyLength, ulong h, <span>int</span> flag);
ZEND_API <span>int</span> zend_hash_find(<span>const</span> HashTable *ht, <span>const</span><span>char</span> *arKey, uint nKeyLength, <span>void</span> **pData);
ZEND_API <span>int</span> zend_hash_quick_find(<span>const</span> HashTable *ht, <span>const</span><span>char</span> *arKey, uint nKeyLength, ulong h, <span>void</span> **pData);
ZEND_API <span>int</span> zend_hash_index_find(<span>const</span> HashTable *ht, ulong h, <span>void</span> **pData);
ZEND_API <span>int</span> zend_hash_exists(<span>const</span> HashTable *ht, <span>const</span><span>char</span> *arKey, uint nKeyLength);
ZEND_API <span>int</span> zend_hash_quick_exists(<span>const</span> HashTable *ht, <span>const</span><span>char</span> *arKey, uint nKeyLength, ulong h);
ZEND_API <span>int</span> zend_hash_index_exists(<span>const</span> HashTable *ht, ulong h);
ZEND_API <span>int</span> zend_hash_move_forward_ex(HashTable *ht, HashPosition *pos);
ZEND_API <span>int</span> zend_hash_move_backwards_ex(HashTable *ht, HashPosition *pos);
ZEND_API <span>int</span> zend_hash_get_current_key_ex(<span>const</span> HashTable *ht, <span>char</span> **str_index, uint *str_length, ulong *num_index, zend_bool duplicate, HashPosition *pos);
ZEND_API <span>int</span> zend_hash_get_current_key_type_ex(HashTable *ht, HashPosition *pos);
ZEND_API <span>int</span> zend_hash_get_current_data_ex(HashTable *ht, <span>void</span> **pData, HashPosition *pos);
ZEND_API <span>int</span> zend_hash_update_current_key_ex(HashTable *ht, <span>int</span> key_type, <span>const</span><span>char</span> *str_index, uint str_length, ulong num_index, <span>int</span> mode, HashPosition *pos);
ZEND_API <span>int</span> zend_hash_get_pointer(<span>const</span> HashTable *ht, HashPointer *ptr);
ZEND_API <span>int</span> zend_hash_set_pointer(HashTable *ht, <span>const</span> HashPointer *ptr);
ZEND_API <span>int</span> zend_hash_sort(HashTable *ht, sort_func_t sort_func, compare_func_t compare_func, <span>int</span> renumber TSRMLS_DC);
ZEND_API <span>int</span> zend_hash_compare(HashTable *ht1, HashTable *ht2, compare_func_t compar, zend_bool ordered TSRMLS_DC);
ZEND_API <span>int</span> zend_hash_minmax(<span>const</span> HashTable *ht, compare_func_t compar, <span>int</span> flag, <span>void</span> **pData TSRMLS_DC);
ZEND_API <span>int</span> zend_hash_num_elements(<span>const</span> HashTable *ht);
ZEND_API <span>int</span> zend_hash_rehash(HashTable *ht);</code>
ログイン後にコピー

上記では、PHP 拡張機能の開発ノート (5) に関連する内容を含むいくつかのマクロと簡単な例を紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート