�����ı�д

����� PHP �û���ĺ�������չ��һ������Ԫ�ء������ڴ����д���������չʱ��Ҳ�����Ķ����½ڣ����д󲿷���Ϣ���ڱ�д����Ҳ����Ч�ġ�

��һ����չ���Ӻ���ʱ��������ʹ�� ext_skel �ű�������ʼ�ṹ�󣬿ɴ���һ�������� C ������ʵ�֣�Ȼ������չ�ĺ��������ṩһ����ڡ�������ڿɺ���һ���Բ�����Ϣ�ṹ��ָ�롣 ���DZ���Ҫ�ṩ����Ϣ�����Ǵ�����ܲ������û򷵻�һ�����ã����ṩ�� PHP ������ API ���ʵ���Ϣ�������������У�����������Ϊֱ�Ӻ����������ݵģ�����ͨ��һ����ջ(stack)���ɺ���ʵ��——����ֱ����Ϊ��ϢԴ——���к˶ԡ�

Example #1 ��С�Ľ���һ�������� PHP ��չ

/* {{{ proto void hello_world()
       Do nothing */
PHP_FUNCTION(hello_world)
{
}
/* }}} */

/* {{{ arginfo_hello_world */
ZEND_BEGIN_ARG_INFO(arginfo_hello_world, 0)
ZEND_END_ARG_INFO()
/* }}} */

/* {{{ demo_functions */
function_entry demo_functions[] = {
    PHP_FE(hello_world, arginfo_hello_world)
    {NULL, NULL, NULL}
}
/* }}} */

/* {{{ demo_module_enry */
zend_module_entry demo_module_entry = {
#if ZEND_MODULE_API_NO >= 20010901
    STANDARD_MODULE_HEADER,
#endif
    "demo",
    demo_functions,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
#if ZEND_MODULE_API_NO >= 20010901
    "1.0.0",
#en
    STANDARD_MODULE_PROPERTIES
}
/* }}} */

�ڴ������У������㿴���������۵�Ԫ�غ�ģ��ṹ��ģ��ṹ�ɲμ� The zend_module structure��

����չ�ĵ�һ������ʵ�ʵ�ʵ�����ݡ� ���չ�������ÿһ������ĺ���֮ǰ������ע�ͼ��������һ�ж�ע���������������û���ģ�͡�

Ϊ��Դ����Բ�ͬ�汾 PHP �ṩ�����ԣ�������������װ�� PHP_FUNCTION �����������Ԥ��������ʹ�� PHP 5.3 ����ת��Ϊ���º�����

void zif_hello_world(int ht, zval *return_value, zval **return_value_ptr,
                     zval *this_ptr, int return_value_used TSRMLS_DC)
{
}

ΪԤ��������û���ĺ�����������ͬ���������������ͻ����������� C ������ zif_ ��Ϊǰ׺����Ҳ�ɿ�������ģ��û�����ò�����ջ�������ȡ PHP ���ݵIJ���������������������·�������о����� INTERNAL_FUNCTION_PARAMETERS ���ж����˵� C ���Լ���IJ�����ʹ�����ṩ�ĺ�ʱ����ע����Щ���������� PHP �汾��ᷢ���仯��

INTERNAL_FUNCTION_PARAMETERS
���ƺ����� ���� ���ʺ�
int ht �û�ʵ�ʴ��ݲ��������� ZEND_NUM_ARGS()
zval *return_value PHP ������ָ�룬����䷵��ֵ���ݸ��û���Ĭ��ֵ�� IS_NULL�� RETVAL_*, RETURN_*
zval **return_value_ptr ����������ʱ��PHP ������Ϊ������ָ�롣�����鷵�����á�  
zval *this_ptr ��������һ���������ã���ָ���� $this ����� PHP ������ getThis()
int return_value_used ָʾ����ֵ�Ƿ�ᱻ������ʹ�õı�־�� caller.  

���������ĺ���ʲô�¶�������ֻ�Ǽ򵥵ط��� NULL ���û����� PHP �û�����Դ����������IJ������ô˺����������õĺ���ͨ�����IJ�����ɣ�

  1. �ֲ��������塣�� C �����б����ں����Ŀ�ͷ����ֲ�������

  2. �����IJ�����PHP ���ݲ�����һ������Ķ�ջ�ϣ�������Բ������ж�ȡ��У�����ͣ�������ʱ������Ҫ�ɽ���ת����

  3. ʵ���߼������������ġ�

  4. �趨����ֵ���������ء�

��ijЩ����£���Щ�����ʵ��˳����ܷ����仯��������������������ߵ�������ñ����Ǹ�˳��

Example #2 һ���򵥵ĺ���

/* {{{ proto void hello_world(string name)
   Greets a user */
PHP_FUNCTION(hello_world)
{
    char *name;
    int name_len;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) {
        return;
    }

    php_printf("Hello %s!", name);

    RETURN_TRUE;
}
/* }}} */

����ĺ���չʾ����Щ���֡������ǿ�ʼ��������У�php_printf ���Ժ����׵ı��µ��DZ�׼�� C ���Ե� printf ��� PHP �İ汾���� printf ��ͬ�������Ǵ�ӡ�����̵� STDOUT ͨ�������ǵ���ǰ����������ɱ��û����л��塣Ҫע����ǣ�php_printf ����󲿷� PHP �� API�������Ƕ����ư�ȫ�ġ���Ҫ�����ư�ȫ���Ӧʹ�� PHPWRITE��

Note: ͨ����˵��Ҫֱ�����������ӡ���ݣ������Ϊ�����ַ������ݸ��û������û�������ʲô�� �˹����������������Ǵ�����������ݣ���ͼ�񣩵ĺ�����API Ҫ����ں������ṩ��������ȡ���ݡ�

���һ�е� RETURN_TRUE �����������£��� return_value ָ�������������Ϊ IS_BOOLEAN��������ֵ��Ϊ true ֵ��Ȼ��� C �����з��ء����Ե�ʹ�ô˺�ʱ��������ڴ��Ҫ������������Դ�Ĺܼң��˺�������ִ�����Ĵ��롣

zend_parse_parameters() ���������ȡ�û��Ӳ�����ջ�������������������ʵ���ת�������ֲ� C ���Ա���������û����ݵIJ���������������Ͳ��ɱ�ת���� �����ᷢ��һ���߳��Ĵ�����Ϣ�������� FAILURE�� ���Ӻ����򵥷��ص������——���޸� return_value����Ĭ�ϵķ���ֵ NULL ���ظ��û���

Note: ��ע�⣬FAILURE ��ʾΪ -1��SUCCESS ��ʾΪ 0��Ϊ��ʹ����������Ӧ����ʹ���������ij�����������ֵ��

���ݸ� zend_parse_parameters() �ĵ�һ���������û�ʵ�ʴ��ݵ������IJ�������������ֵ��Ϊ ht ���������������������������۵�������Ӧʹ����Ϊʵ��ϸ�ڵ� ZEND_NUM_ARGS()��

Ϊ���� PHP ���̸߳��롢�̰߳�ȫ��Դ���������ݣ���Ҫ�� TSRMLS_CC �����߳������ġ�������������ͬ�������������IJ�������Ϊ�� zend_parse_parameters ��Ҫ���в��������IJ���——������Ҫ��ȡ���û�������������

���߳�������֮������Ҫ��IJ�����ÿ�����������ַ����е�һ���ַ���ʾ�����͡� ���ϣ��һ���ַ������������ڴ�����˵��ֻ�����Ǹ� "s"��

���һ���Ǵ���һ������ָ���Ҫ������ֵ�� C ���������ṩ����ϸ�ڡ������ַ�������ʵ�ϵ��ַ����������� NULL ��β���� char*�����䳤���dz� NULL �ֽ���� int ��ֵ��

�����������˵�����Ͷ�Ӧ�ĸ��ӵ� C �������͵��ĵ�����Դ���뷢�����е��ļ� README.PARAMETER_PARSING_API ���ҵ����������Ҫ���Ϳɼ��±�

zend_parse_parameters() ����˵����
���η� ���Ӳ��������� ����
b zend_bool Boolean ֵ
l long integer (long) ֵ
d double float (double) ֵ
s char*, int �����Ƶİ�ȫ��
h HashTable* ����Ĺ�ϣ��