<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>
<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>
因为在笔记(1)说过了,扩展没办法直接初始化数组属性,所以这里我们定义一个静态的属性初始化为null(zend_declare_property_null),之后去修改(zend_update_static_property)这个属性的值为相应的数组,就达到了 public static $array 的效果。
相应的变量名字是定义了宏,所以你直接copy代码没办法编译通过,欢迎交流
以上就介绍了php扩展开发笔记(3)类的静态数组属性定义,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。