原生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);
}