PHP7扩展开发实例

原生PHP:

<?php

class Page {

	private $objServiceData;

	public function __construct() {
		$this->objServiceData = new data();
	}

	public function execute($intUid) {
		$res = $this->objServiceData->getUserInfo($intUid);
		if (empty($res)) {
			return false;
		}
		return $res;
	} 

	public function executeSet($intUid, $strName) {
		$this->objServiceData->setUserInfo($intUid, $strName);
	}

	public function executePrint() {
		$arr = $this->objServiceData->getUserList();
		foreach ($arr as $key=>$val) {
			print_r($key . '----' . $val);
			echo "\n";
		}
	}
}

class Data {

	private $arrUserList;

	public function __construct() {

	}

	public function getUserInfo($intUid) {
		$arr = $this->arrUserList;

		return $arr[$intUid];
	}

	public function setUserInfo($intUid, $strName) {
		$this->arrUserList[$intUid] = $strName;
	}

	public function getUserList() {
		return $this->arrUserList;
	}
}

使用PHP7扩展开发实现同样的功能

文件分为4个部分:sola_data.h、sola_data.c、sola_page.h、sola_page.c

sola_data.h和sola_data.c对应原生PHP的Data类

#ifndef SOLA_DATA_H
#define SOLA_DATA_H

extern zend_class_entry *sola_data_ce;

SOLARIENS_STARTUP_FUNCTION(data);

#endif

#ifdef HAVE_CONFIG_H
    #include "config.h"
#endif

#include "php.h"
#include "sola_data.h"
#include "php_solariens.h"
#include "zend_interfaces.h"

zend_class_entry *sola_data_ce;

ZEND_METHOD(sola_data, __construct) {

}

ZEND_METHOD(sola_data, getUser) {
    zend_ulong uid;
    zval user;
    zval *result;
    zval user_name01, user_name02;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &uid) == FAILURE) {
        RETURN_FALSE;
    }

    ZVAL_NEW_ARR(&user);
    zend_hash_init(Z_ARRVAL(user), 2, NULL, ZVAL_PTR_DTOR, 0);

    ZVAL_STRING(&user_name01, "solariens");
    if (zend_hash_index_add(Z_ARRVAL(user), 123, &user_name01) == NULL) {
        php_printf("error\n");
        RETURN_FALSE;
    }
    ZVAL_STRING(&user_name02, "liuheng");
    if (zend_hash_index_add(Z_ARRVAL(user), 456, &user_name02) == NULL) {
        php_printf("error\n");
        RETURN_FALSE;
    }

    result = zend_hash_index_find(Z_ARRVAL(user), uid);

    zval_ptr_dtor(&user);

    ZVAL_STRING(return_value, Z_STRVAL_P(result));
    zval_ptr_dtor(return_value);
}

ZEND_METHOD(sola_data, setUserInfo) {
    zend_ulong uid;
    zval *name;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lz", &uid, &name) == FAILURE) {
        RETURN_FALSE;
    }

    zval *res = zend_read_property(sola_data_ce, getThis(), "arrUserList", strlen("arrUserList"), 0, NULL);

    if (Z_TYPE_P(res) != IS_ARRAY) {

        ZVAL_NEW_ARR(res);
        zend_hash_init(Z_ARRVAL_P(res), 4, NULL, ZVAL_PTR_DTOR, 0);

    }

    zend_hash_index_add(Z_ARRVAL_P(res), uid, name);
    zend_update_property(sola_data_ce, getThis(), "arrUserList", strlen("arrUserList"), res);
}

ZEND_METHOD(sola_data, getUserInfo) {
    zend_ulong uid;
    zval *res;
    zval *ret;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &uid) == FAILURE) {
        RETURN_FALSE;
    }

    res = zend_read_property(sola_data_ce, getThis(), "arrUserList", strlen("arrUserList"), 0, NULL);

    if (Z_TYPE_P(res) != IS_ARRAY) {
        RETURN_FALSE;
    }

    ret = zend_hash_index_find(Z_ARRVAL_P(res), uid);

    if (ret == NULL) {
        RETURN_FALSE;
    }

    ZVAL_STRING(return_value, Z_STRVAL_P(ret));
}

ZEND_METHOD(sola_data, getUserList) {

    zval *res = zend_read_property(sola_data_ce, getThis(), "arrUserList", strlen("arrUserList"), 0, NULL);

    if (Z_TYPE_P(res) != IS_ARRAY) {
        RETURN_FALSE;
    }

    RETURN_ARR(Z_ARRVAL_P(res));
}

zend_function_entry sola_data_method[] = {
    PHP_ME(sola_data, __construct, NULL, ZEND_ACC_PUBLIC)
    PHP_ME(sola_data, getUser, NULL, ZEND_ACC_PUBLIC)
    PHP_ME(sola_data, setUserInfo, NULL, ZEND_ACC_PUBLIC)
    PHP_ME(sola_data, getUserInfo, NULL, ZEND_ACC_PUBLIC)
    PHP_ME(sola_data, getUserList, NULL, ZEND_ACC_PUBLIC)
    {NULL, NULL, NULL}
};

SOLARIENS_STARTUP_FUNCTION(data) {
    zend_class_entry ce;
    INIT_CLASS_ENTRY(ce, "Data", sola_data_method);
    sola_data_ce = zend_register_internal_class(&ce);

    zend_declare_property_null(sola_data_ce, "arrUserList", strlen("arrUserList"), ZEND_ACC_PRIVATE);
}

sola_page.h和sola_page.c对应原生PHP的Page类

#ifndef SOLA_PAGE_H
#define SOLA_PAGE_H

#define SOLA_STR(str) str, strlen(str)

extern zend_class_entry *sola_page_ce;

SOLARIENS_STARTUP_FUNCTION(page);

#endif


#ifdef HAVE_CONFIG_H
    #include "config.h"
#endif

#include "php.h"
#include "php_solariens.h"
#include "sola_page.h"
#include "sola_data.h"

zend_class_entry *sola_page_ce;

ZEND_METHOD(sola_page, __construct) {

    zval obj_name;
    object_init_ex(&obj_name, sola_data_ce);

    zend_update_property(sola_page_ce, getThis(), SOLA_STR("objServiceData"), &obj_name);

    zval_ptr_dtor(&obj_name);
}

ZEND_METHOD(sola_page, execute) {
    zend_ulong uid;
    zval *obj;
    zval func_name, retval, params[1];

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &uid) == FAILURE) {
        RETURN_FALSE;
    }

    obj = zend_read_property(sola_page_ce, getThis(), SOLA_STR("objServiceData"), 0, NULL);

    ZVAL_STRING(&func_name, "getUser");
    ZVAL_LONG(¶ms[0], uid);
    call_user_function(EG(function_table), obj, &func_name, &retval, 1, params);

    zval_ptr_dtor(&func_name);
    zval_ptr_dtor(¶ms[0]);

    RETURN_STRING(Z_STRVAL(retval));
}

ZEND_METHOD(sola_page, executeSet) {
    zend_ulong uid;
    zval *name;
    zval *obj;
    zval func_name, retval, params[2];

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lz", &uid, &name) == FAILURE) {
        RETURN_FALSE;
    }

    obj = zend_read_property(sola_page_ce, getThis(), SOLA_STR("objServiceData"), 0, NULL);

    if (Z_TYPE_P(obj) != IS_OBJECT) {
        RETURN_FALSE;
    }

    ZVAL_STRING(&func_name, "setUserInfo");
    ZVAL_LONG(¶ms[0], uid);
    ZVAL_STRING(¶ms[1], Z_STRVAL_P(name));
    call_user_function(EG(function_table), obj, &func_name, &retval, 2, params);

    zval_ptr_dtor(&func_name);

    zval_ptr_dtor(¶ms[0]);
}

ZEND_METHOD(sola_page, executePrint) {
    zval *obj;
    zval func_name, retval;
    int num, i, key_type, num_idx;
    zend_string *str_idx;
    zval *dataval;

    obj = zend_read_property(sola_page_ce, getThis(), SOLA_STR("objServiceData"), 0, NULL);

    if (Z_TYPE_P(obj) != IS_OBJECT) {
        RETURN_FALSE;
    }

    ZVAL_STRING(&func_name, "getUserList");
    call_user_function(EG(function_table), obj, &func_name, &retval, 0, NULL);

    if (Z_TYPE(retval) != IS_ARRAY) {
        RETURN_FALSE;
    }
    zend_hash_internal_pointer_reset(Z_ARRVAL(retval));
    num = zend_hash_num_elements(Z_ARRVAL(retval));

    for (i=0; i<num; ++i) {
        key_type = zend_hash_get_current_key(Z_ARRVAL(retval), &str_idx, &num_idx);

        dataval = zend_hash_get_current_data(Z_ARRVAL(retval));
        convert_to_string(dataval);
        if (key_type == HASH_KEY_IS_LONG) {
            php_printf("[%d] => %s\n", num_idx, Z_STRVAL_P(dataval));
        } else if (key_type == HASH_KEY_IS_STRING) {
            php_printf("[%s] => %s\n", ZSTR_VAL(str_idx), Z_STRVAL_P(dataval));
        }
        zend_hash_move_forward(Z_ARRVAL(retval));
    }
    RETURN_TRUE;
}

zend_function_entry sola_page_method[] = {
    PHP_ME(sola_page, __construct, NULL, ZEND_ACC_PUBLIC)
    PHP_ME(sola_page, execute, NULL, ZEND_ACC_PUBLIC)
    PHP_ME(sola_page, executeSet, NULL, ZEND_ACC_PUBLIC)
    PHP_ME(sola_page, executePrint, NULL, ZEND_ACC_PUBLIC)
    {NULL, NULL, NULL}
};

SOLARIENS_STARTUP_FUNCTION(page) {
    zend_class_entry ce;
    INIT_CLASS_ENTRY(ce, "Page", sola_page_method);
    sola_page_ce = zend_register_internal_class(&ce);
    zend_declare_property_null(sola_page_ce, SOLA_STR("objServiceData"), ZEND_ACC_PRIVATE);
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值