PHP扩展开发-简单类扩展
今天来学习简单类扩展开发
实现目标为如下php的类
<?php
class classext(){ private $username; CONST URL="http://www.google.com"; public function __construct(){} public function getName(){
return $this->username;
} public function setName($name){
$this->username=$name;
} public function __destruct(){} } ?>
1.先使用./ext_skel --extname=classext创建扩展框架
2.在php_classext.h中添加声明成员变量,代码如下
PHP_METHOD(classext,__construct);
PHP_METHOD(classext,__destruct);
PHP_METHOD(classext,getName);
PHP_METHOD(classext,setName);
3.在classext.c中添加相应的函数,我把所有代码贴出来大家参考
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif #include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
#include "php_classext.h" static int le_classext; zend_class_entry *classext_ce; /* 类方法的参数 */
ZEND_BEGIN_ARG_INFO(setName_args, )
ZEND_ARG_INFO(, name)
ZEND_END_ARG_INFO() PHP_METHOD(classext,__construct){ } PHP_METHOD(classext,__destruct){ } PHP_METHOD(classext,getName){
zval *self,*name;
self = getThis();
name = zend_read_property(Z_OBJCE_P(self),self,ZEND_STRL("username"), TSRMLS_CC); RETURN_STRING(Z_STRVAL_P(name),);
} PHP_METHOD(classext, setName) {
char *arg = NULL;
int arg_len;
zval *value, *self; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
WRONG_PARAM_COUNT;
} self = getThis(); MAKE_STD_ZVAL(value);
ZVAL_STRINGL(value, arg, arg_len, ); SEPARATE_ZVAL_TO_MAKE_IS_REF(&value);
zend_update_property(Z_OBJCE_P(self), self, ZEND_STRL("username"), value TSRMLS_CC); RETURN_TRUE;
} const zend_function_entry classext_functions[] = {
PHP_ME(classext, __construct, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
PHP_ME(classext, __destruct, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_DTOR)
PHP_ME(classext, getName, NULL, ZEND_ACC_PUBLIC)
PHP_ME(classext, setName, setName_args, ZEND_ACC_PUBLIC)
{NULL, NULL, NULL} /* Must be the last line in martin_functions[] */
}; PHP_MINIT_FUNCTION(classext)
{
zend_class_entry classext;
INIT_CLASS_ENTRY(classext, "Classext", classext_functions);
classext_ce = zend_register_internal_class_ex(&classext, NULL, NULL TSRMLS_CC);
/* 声明常量URL */
zend_declare_class_constant_stringl(classext_ce, ZEND_STRL("URL"), ZEND_STRL("http://www.google.com") TSRMLS_CC);
/* 声明私有成员变量 username
ZEND_STRL("username")等价于"username",sizeof("username")-1;详见zend.h */
zend_declare_property_null(classext_ce, ZEND_STRL("username"), ZEND_ACC_PRIVATE TSRMLS_CC); return SUCCESS;
} PHP_MSHUTDOWN_FUNCTION(classext)
{
return SUCCESS;
} PHP_RINIT_FUNCTION(classext)
{
return SUCCESS;
} PHP_RSHUTDOWN_FUNCTION(classext)
{
return SUCCESS;
} PHP_MINFO_FUNCTION(classext)
{
php_info_print_table_start();
php_info_print_table_header(, "classext support", "enabled");
php_info_print_table_header(, "The Version", "1.0.2");
php_info_print_table_end();
} zend_module_entry classext_module_entry = {
STANDARD_MODULE_HEADER,
"classext",
NULL,
PHP_MINIT(classext),
PHP_MSHUTDOWN(classext),
PHP_RINIT(classext),
PHP_RSHUTDOWN(classext),
PHP_MINFO(classext),
PHP_CLASSEXT_VERSION,
STANDARD_MODULE_PROPERTIES
}; #ifdef COMPILE_DL_CLASSEXT
ZEND_GET_MODULE(classext)
#endif
4.编译扩展;ps:记得把config.m4中的第10,12行dnl删掉
5.重启php环境,加载相应的扩展后,我们在php脚本中执行
<?php
$class = new classext();
$class->setName("xiaozong");
echo $class->getName();
?>
输出:xiaozong
PHP扩展开发-简单类扩展的更多相关文章
- Chrome扩展开发之一——Chrome扩展的文件结构
目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...
- Chrome扩展开发之三——Chrome扩展中的数据本地存储和下载
目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...
- PHP扩展开发:第一个扩展
在上一篇文章<PHP扩展开发:安装PHP>我们已经将开发PHP扩展的PHP环境安装成功,那么接下来采用最简单直接的方式创建第一个扩展. 我们先假设业务场景,是需要有这么一个扩展,提供一个叫 ...
- firefox扩展开发(一) : 扩展的基本结构
用过firefox的人肯定要安装firefox的扩展,这样才能发挥火狐的全部实力.一般扩展是一个后缀为.xpi的文件,其实这个文件就是zip格式的压缩包,压缩了一个扩展所需要的所有目录和文件,基本的目 ...
- Chrome扩展开发之二——Chrome扩展中脚本的运行机制和通信方式
目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...
- Chrome扩展开发之四——核心功能的实现思路
目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...
- 如何用原生js开发一个Chrome扩展程序
原文地址:How to Build a Simple Chrome Extension in Vanilla JavaScript 开发一个Chrome扩展程序非常简单,只需要使用原生的js就可以完成 ...
- 扩展 WPF 动画类
原文:扩展 WPF 动画类 扩展 WPF 动画类 Charles ...
- OC-ARC,类扩展,block
总结 标号 主题 内容 一 autorelease autorelease基本概念/自动释放池/autorelease基本使用 二 autorelease注意事项 注意点/应用场景 三 ARC 什么是 ...
随机推荐
- MarkDown编写规范指南
Markdown 编写规范指南 简介: Markdown的目标是实现「易读易写」,成为一种适用于网络的「书写语言」. 一份使用Markdown格式撰写的文件可以直接以纯文本发布,它的最大灵感来源其实是 ...
- ubuntu下百度云安装
1.安装 在github上下载 .deb 安装包 下载地址 https://github.com/LiuLang/bcloud-packages 下载完成双击安装文件安装成功 2.解决验证码问题 (1 ...
- L3-004. 肿瘤诊断
L3-004. 肿瘤诊断 题目链接:https://www.patest.cn/contests/gplt/L3-004 BFS 之前尝试使用递归dfs,提交后发现有两个段错误,发现递归层数太多,然后 ...
- nmon安装(转)
安装说明安装环境:CentOS-6.3安装方式:源码编译安装软件:nmon_linux_14i.tar.gz下载地址:nmon:http://nmon.sourceforge.net/pm ... n ...
- Node.js:常用工具util
概要:本篇博客的主要内容是介绍node.js的常用工具util. 1.util.inherits util.inherits(constructor,superConstructor)是一个实现对象间 ...
- 【LeetCode】419. Battleships in a Board
Given an 2D board, count how many different battleships are in it. The battleships are represented w ...
- 《高性能Javascript》读书笔记-1
第一章 加载和执行 当浏览器执行JavaScript代码时,不能同时做其他任何事情(单一进程),意味着<script>标签每次出现都霸道地让页面等带脚本的解析和执行(每个文件必须等到前一个 ...
- HttpClient, HttpClientHandler, and WebRequestHandler介绍
注:本文为个人学习摘录,原文地址:https://blogs.msdn.microsoft.com/henrikn/2012/08/07/httpclient-httpclienthandler-an ...
- agentX各个角色功能
AgentX Roles 1.master An entity acting in a master agent role performs the following functions: - ...
- linux上安装mono发布.net网站步骤
在linux上部署mono 1.自己安装好linux 2.使用桥接方式,让虚拟机和本机在一个局域网内 3.安装apache服务器 4.安装libgdiplug 5.安装mono 6.安装xsp 7.安 ...