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 什么是 ...
随机推荐
- 淘淘商城_day08_课堂笔记
今日大纲 问题,如何实现商品数据的同步? 学习MQ(消息队列) 搭建RabbitMQ的环境 学习RabbitMQ的队列 学习Spring-Rabbit 使用RabbitMQ完成商品数据的同步 如何实现 ...
- L2-007. 家庭房产
L2-007. 家庭房产 题目链接:https://www.patest.cn/contests/gplt/L2-007 并查集 初学,看这题的时候完全没有什么好的想法,参考了@yinzm的blog用 ...
- ListView的条目点击焦点的问题
由于ListView条目里有ImageButton,导致抢占了条目点击事件,所以在item的跟布局中加入 android:descendantFocusability="blocksDesc ...
- PAT 团体程序设计天梯赛-练习集 L1-015. 跟奥巴马一起画方块
美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统.2014年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正 ...
- autocomplete+PHP+MYSQL的实现模糊查询
1.HTML网页表单部分: <input type="text" name="course" id="course" /> 2. ...
- linshi_temp_erweima_html_backup
<!doctype html><html><head><meta charset="utf-8"><meta content= ...
- bug记录_document.defaultview.getcomputedstyle()
页面中使用document.defaultview.getcomputedstyle()在火狐下取不到值. 原本方法现在$(document).ready()中,换到window.onload里就可以 ...
- Spring入门学习(二)三种实例化bean的方法
前面的哪一种就是通过构造函数来实例化对象 下面我们可能用到工厂方法来视力话对象,这样我们的配置文件又该怎么配置呢 <bean name="service2" class=&q ...
- Tomcat基础
一.Tomcat体系结构 tomcat应该是java程序员最熟悉的servlet容器了,作为一个用java实现的web应用程序服务器,下图是tomcat的体系结构 一个常见的Tomcat配置文件以下x ...
- SQL_where条件的优化
原则,多数数据库都是从 左到右的顺序处理条件,把能过滤更多数据的条件放在前面,过滤少的条件放后面 SQL1: select * from employee where sala ...