今天来学习简单类扩展开发

实现目标为如下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扩展开发-简单类扩展的更多相关文章

  1. Chrome扩展开发之一——Chrome扩展的文件结构

    目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...

  2. Chrome扩展开发之三——Chrome扩展中的数据本地存储和下载

    目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...

  3. PHP扩展开发:第一个扩展

    在上一篇文章<PHP扩展开发:安装PHP>我们已经将开发PHP扩展的PHP环境安装成功,那么接下来采用最简单直接的方式创建第一个扩展. 我们先假设业务场景,是需要有这么一个扩展,提供一个叫 ...

  4. firefox扩展开发(一) : 扩展的基本结构

    用过firefox的人肯定要安装firefox的扩展,这样才能发挥火狐的全部实力.一般扩展是一个后缀为.xpi的文件,其实这个文件就是zip格式的压缩包,压缩了一个扩展所需要的所有目录和文件,基本的目 ...

  5. Chrome扩展开发之二——Chrome扩展中脚本的运行机制和通信方式

    目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...

  6. Chrome扩展开发之四——核心功能的实现思路

    目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...

  7. 如何用原生js开发一个Chrome扩展程序

    原文地址:How to Build a Simple Chrome Extension in Vanilla JavaScript 开发一个Chrome扩展程序非常简单,只需要使用原生的js就可以完成 ...

  8. 扩展 WPF 动画类

    原文:扩展 WPF 动画类 扩展 WPF 动画类                                                                     Charles ...

  9. OC-ARC,类扩展,block

    总结 标号 主题 内容 一 autorelease autorelease基本概念/自动释放池/autorelease基本使用 二 autorelease注意事项 注意点/应用场景 三 ARC 什么是 ...

随机推荐

  1. EasyuiAPI:布局

    一.Panel(面板) 1.通过标签创建: <div id="p" class="easyui-panel" title="My Panel&q ...

  2. 设置 SSH 免密码登陆——仍提示输入密码

    1)生成密钥:在根目录下(cd  ~/   用户根目录)执行如下语句: ssh-keygen -t dsa -P ' ' -f ~/.ssh/id_dsa 以上是两个单引号. 2)将id_dsa.pu ...

  3. strrchr

    strrchr() 函数查找字符在指定字符串中从正面开始的最后一次出现的位置,如果成功,则返回从该位置到字符串结尾的所有字符,如果失败,则返回 false.与之相对应的是strchr()函数,它查找字 ...

  4. 多线程---其他方法 停止线程、守护线程、join方法

    第三方停止线程: 原来是stop(),因为该方法有些问题,所以被interrupt()方法取代,它的用途跟机制是 当没有指定的方式让冻结的线程恢复到运行状态时,这时需要对冻结进行清除,强制让线程恢复到 ...

  5. Python 跳出多重循环

    Python 本身没有“break n” 和“goto” 的语法,这也造成了Python 难以跳出多层(特定层数)循环.下面是几个跳出多层(特定层数)循环的tip. 1.自定义异常   class g ...

  6. (转载)html dom节点操作(获取/修改/添加或删除)

    DOM 是关于如何获取.修改.添加或删除 HTML 元素的标准,下面为大家介绍下html dom节点操作,感兴趣的朋友可以参考下   HTML DOM 是关于如何获取.修改.添加或删除 HTML 元素 ...

  7. 【优先队列-求第Ki大的数】Black Box

    Black Box Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8637   Accepted: 3542 Descrip ...

  8. Understanding Neural Networks Through Deep Visualization

    当数据一层一层通过更多的卷积层时,你可以得到的特征图像代表的特征就会更加的复杂. 在网络的最后,你也许可以得到一个抽象的物体.如果你想通过可视化方法在卷积神经网络中看到更多的信息.这里有一个工具方便你 ...

  9. k个区间相交的段落数 Educational Codeforces Round 4 D

    http://codeforces.com/contest/612/problem/D 题目大意:给你n个区间,这n个区间会有相交的部分,如果一个区间相交的部分>=k,那么就把这个区间记录下来. ...

  10. python&MongoDB

    1 #!/usr/bin/python 2 #-*- coding:utf-8 3 import pymongo 4 connection=pymongo.MongoClient() 5 tdb=co ...