ホームページ >バックエンド開発 >PHPチュートリアル >PHP拡張開発ノート(3) クラスの静的配列属性定義

PHP拡張開発ノート(3) クラスの静的配列属性定義

WBOY
WBOYオリジナル
2016-08-08 09:23:031347ブラウズ

phpサンプルコード

<code><span><span>class</span><span>Slash_Log</span> {</span><span>const</span> EMERGENCY = <span>1</span>;
    <span>const</span> ALERT = <span>2</span>;
    <span>const</span> CRITICAL = <span>3</span>;
    <span>const</span> FATAL = <span>3</span>;
    <span>const</span> ERROR = <span>4</span>;
    <span>const</span> WARN = <span>5</span>;
    <span>const</span> NOTICE = <span>6</span>;
    <span>const</span> INFO = <span>7</span>;
    <span>const</span> DEBUG = <span>8</span>;

    <span>public</span><span>static</span><span>$levels</span> = <span>array</span>(
        <span>self</span>::EMERGENCY => <span>1</span>,
        <span>self</span>::ALERT => <span>2</span>,
        <span>self</span>::CRITICAL => <span>3</span>,
        <span>self</span>::FATAL => <span>3</span>,
        <span>self</span>::ERROR => <span>4</span>,
        <span>self</span>::WARN => <span>5</span>,
        <span>self</span>::NOTICE => <span>6</span>,
        <span>self</span>::INFO => <span>7</span>,
        <span>self</span>::DEBUG => <span>8</span>,
   );
}</code>

php拡張機能によって実装されたコード

<code>zend_class_entry ce;
SLASH_INIT_CLASS_ENTRY(ce, SLASH_CN_LOG, slash_log_methods);
slash_log_ce = zend_register_internal_class(&ce TSRMLS_CC);

<span>// {{{ log level</span>
zend_declare_class_constant_long(slash_log_ce, ZEND_STRL(SL_EMERGENCY_K), SL_EMERGENCY_V TSRMLS_CC);
zend_declare_class_constant_long(slash_log_ce, ZEND_STRL(SL_ALERT_K), SL_ALERT_V TSRMLS_CC);
zend_declare_class_constant_long(slash_log_ce, ZEND_STRL(SL_CRITICAL_K), SL_CRITICAL_V TSRMLS_CC);
zend_declare_class_constant_long(slash_log_ce, ZEND_STRL(SL_ERROR_K), SL_ERROR_V TSRMLS_CC);
zend_declare_class_constant_long(slash_log_ce, ZEND_STRL(SL_WARN_K), SL_WARN_V TSRMLS_CC);
zend_declare_class_constant_long(slash_log_ce, ZEND_STRL(SL_NOTICE_K), SL_NOTICE_V TSRMLS_CC);
zend_declare_class_constant_long(slash_log_ce, ZEND_STRL(SL_INFO_K), SL_INFO_V TSRMLS_CC);
zend_declare_class_constant_long(slash_log_ce, ZEND_STRL(SL_DEBUG_K), SL_DEBUG_V TSRMLS_CC);
<span>// }}}</span><span>// {{{ static property array</span>
zend_declare_property_null(slash_log_ce, ZEND_STRL(SL_P_LEVELS), ZEND_ACC_PUBLIC|ZEND_ACC_STATIC TSRMLS_CC);

zval *levels;
MAKE_STD_ZVAL(levels);
array_init(levels);

add_index_stringl(levels, SL_EMERGENCY_V, ZEND_STRL(SL_EMERGENCY_K), <span>0</span>);
add_index_stringl(levels, SL_ALERT_V, ZEND_STRL(SL_ALERT_K), <span>0</span>);
add_index_stringl(levels, SL_CRITICAL_V, ZEND_STRL(SL_CRITICAL_K), <span>0</span>);
add_index_stringl(levels, SL_ERROR_V, ZEND_STRL(SL_ERROR_K), <span>0</span>);
add_index_stringl(levels, SL_WARN_V, ZEND_STRL(SL_WARN_K), <span>0</span>);
add_index_stringl(levels, SL_NOTICE_V, ZEND_STRL(SL_NOTICE_K), <span>0</span>);
add_index_stringl(levels, SL_INFO_V, ZEND_STRL(SL_INFO_K), <span>0</span>);
add_index_stringl(levels, SL_DEBUG_V, ZEND_STRL(SL_DEBUG_K), <span>0</span>);
zend_update_static_property(slash_log_ce, ZEND_STRL(SL_P_LEVELS), levels TSRMLS_CC);
<span>// }}}</span></code>

Notes

注(1)で述べたように、拡張機能は配列属性を直接初期化できないため、ここでは静的属性の初期化をnull(zend_declare_property_null)として定義し、その後このプロパティの値を対応する配列に変更 (zend_update_static_property) することで、public static $array の効果が得られます。

対応する変数名にはマクロが定義されているため、コードを直接コピーするとコンパイルされません

上記は、PHP 拡張機能開発ノート (3) クラスの静的配列属性の定義を、関連する内容も含めて紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。