class Vector2D
{
private $_x;
private $_y; /**
* Constructor.
*/
public function __construct($x = 0, $y = 0)
{
$this->_x = $x;
$this->_y = $y;
} /**
* Generates a copy of $this vector.
* @return Vector2D A copy of $this vector.
*/
public function mycopy()
{
return new Vector2D($this->_x, $this->;_y);
} /**
* Sets $this vector's x and y values, and thus length, to zero.
* @return Vector2D A reference to $this vector.
*/
public function zero()
{
$this->_x = 0;
$this->_y = 0;
return $this;
} /**
* Whether or not $this vector is equal to zero, i.e. its x, y, and length are zero.
* @return Boolean True if vector is zero, otherwise false.
*/
public function isZero()
{
return $this->_x == 0 && $this->_y == 0;
}
public function getX()
{
return $this->_x;
}
public function getY()
{
return $this->_y;
}
}

第一步:建立扩展骨架

 cd php-5.2.14/ext./ext_skel

 --extname=vector

第二步:修改编译参数

 cd php-5.2.14/ext/vector
vi config.m4

去掉

 PHP_ARG_ENABLE(vector, whether to enable vector support,
[ --enable-vector Enable vector support])

两行前面的dnl

修改后为:

 dnl Otherwise use enable:

 PHP_ARG_ENABLE(vector, whether to enable vector support,

 dnl Make sure that the comment is aligned:

 [ --enable-vector Enable vector support])

第三步:编写代码
vim php_vector.h


PHP_FUNCTION(confirm_vector_compiled); /* For testing, remove later. */
后面增加声明函数

 PHP_METHOD(Vector2D, __construct);
PHP_METHOD(Vector2D, mycopy);
PHP_METHOD(Vector2D, zero);
PHP_METHOD(Vector2D, isZero);
PHP_METHOD(Vector2D, getX);
PHP_METHOD(Vector2D, getY);

vim vector.c
声明方法的参数,注册到函数表中

 ZEND_BEGIN_ARG_INFO(arg_construct, 2) //声明arg_construct为含有x,y的2个参数
ZEND_ARG_INFO(0, x)
ZEND_ARG_INFO(0, y)
ZEND_END_ARG_INFO() zend_function_entry vector_functions[] = {
PHP_FE(confirm_vector_compiled, NULL) /* For testing, remove later. */
PHP_ME(Vector2D, __construct, arg_construct, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)//
PHP_ME(Vector2D, mycopy, NULL, ZEND_ACC_PUBLIC)
PHP_ME(Vector2D, zero, NULL, ZEND_ACC_PUBLIC)
PHP_ME(Vector2D, isZero, NULL, ZEND_ACC_PUBLIC)
PHP_ME(Vector2D, getX, NULL, ZEND_ACC_PUBLIC)
PHP_ME(Vector2D, getY, NULL, ZEND_ACC_PUBLIC)
{NULL, NULL, NULL} /* Must be the last line in vector_functions[] */
};

ZEND_ACC_CTOR表示为构造函数
ZEND_ACC_PUBLIC为访问权限标记,表示public访问权限

在模块初始化函数中注册并初始化类

 zend_class_entry *Vector2D_ce; //类结构变量
PHP_MINIT_FUNCTION(vector)
{
/* If you have INI entries, uncomment these lines
REGISTER_INI_ENTRIES();
*/
zend_class_entry Vector2D; INIT_CLASS_ENTRY(Vector2D, "Vector2D", vector_functions);//第二个参数为类名,第三个参数为函数表
Vector2D_ce = zend_register_internal_class_ex(&Vector2D, NULL, NULL TSRMLS_CC);//注册类 zend_declare_property_null(Vector2D_ce, ZEND_STRL("_x"), ZEND_ACC_PRIVATE TSRMLS_CC);//初始化_x属性
zend_declare_property_null(Vector2D_ce, ZEND_STRL("_y"), ZEND_ACC_PRIVATE TSRMLS_CC);//初始化_y属性 return SUCCESS;
}

在文件最后面增加具体类方法的实现代码:

 PHP_METHOD(Vector2D, __construct) {
long int x,y;
//获取x,y参数
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &x, &y) == FAILURE) {
WRONG_PARAM_COUNT;
} //更改_x,_y属性值
zend_update_property_long(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_x"), x TSRMLS_CC);
zend_update_property_long(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_y"), y TSRMLS_CC); RETURN_TRUE;
} PHP_METHOD(Vector2D, mycopy) {
zval *copy_obj;
zval *x_value,*y_value; MAKE_STD_ZVAL(copy_obj);
//初始化对象,对象所属的类为Vector2D_ce
object_init_ex(copy_obj, Vector2D_ce); //获得_x,_y的属性值
x_value = zend_read_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_x"), 0 TSRMLS_CC);
y_value = zend_read_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_y"), 0 TSRMLS_CC); //更新Vector2D_ce类对象copy_obj的属性值_x,_y
zend_update_property(Z_OBJCE_P(getThis()), copy_obj, ZEND_STRL("_x"), x_value TSRMLS_CC);
zend_update_property(Z_OBJCE_P(getThis()), copy_obj, ZEND_STRL("_y"), y_value TSRMLS_CC);
//返回该对象
RETURN_ZVAL(copy_obj, 1, 0);
} PHP_METHOD(Vector2D, zero) {
//更改_x,_y的属性值为0
zend_update_property_long(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_x"), 0 TSRMLS_CC);
zend_update_property_long(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_y"), 0 TSRMLS_CC);
//返回当前类实例
RETURN_ZVAL(getThis(), 1, 0);;
} PHP_METHOD(Vector2D, isZero) { zval *zx, *zy;
long x,y;
// 获得_x,_y的属性值
zx = zend_read_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_x"), 0 TSRMLS_CC);
zy = zend_read_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_y"), 0 TSRMLS_CC); x = Z_LVAL_P(zx);
y = Z_LVAL_P(zy); if(x==0 && y==0){
RETURN_BOOL(1);
}else{
RETURN_BOOL(0);
} } PHP_METHOD(Vector2D, getX) { zval *zx;
long x; zx = zend_read_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_x"), 0 TSRMLS_CC);
x = Z_LVAL_P(zx); RETURN_LONG(x);
} PHP_METHOD(Vector2D, getY) { zval *zy;
long y; zy = zend_read_property(Z_OBJCE_P(getThis()), getThis(), ZEND_STRL("_y"), 0 TSRMLS_CC);
y = Z_LVAL_P(zy); RETURN_LONG(y);
}

第四步:编译代码

 cd php-5.2./ext/vector
/opt/module/php/bin/phpize
./configure --with-php-config=/opt/module/php/bin/php-config
make
make install

第五步:配置扩展

在[PHP]模块下增加:

 extension = vector.so
service httpd restart

php扩展类开发实例的更多相关文章

  1. UI(UGUI)框架(二)-------------UIManager单例模式与开发BasePanel面板基类/UIManage统一管理UI面板的实例化/开发字典扩展类

    UIManage单实例: /// 单例模式的核心 /// 1,定义一个静态的对象 在外界访问 在内部构造 /// 2,构造方法私有化 private static UIManager _instanc ...

  2. ios开发总结:Utils常用方法等收集,添加扩展类,工具类方法,拥有很多方便快捷功能(不断更新中。。。)

    BOBUtils 工具大全 本人github开源和收集功能地址:https://github.com/niexiaobo [对ios新手或者工作一年以内开发人员很有用处] 常用方法等收集.添加扩展类. ...

  3. Python开发——面向对象【类、实例】

    类 # class Chinese(object): class Chinese: ''' 类的说明性文档 ''' pass print(Chinese) # <class '__main__. ...

  4. Cocos2d-x 3.X手游开发实例详解

    Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048.卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰 ...

  5. 免费的HTML5连载来了《HTML5网页开发实例详解》连载(三)DOCTYPE和字符集

    在2.1.2节中通过新老DOCTYPE的对比,读者可以清晰地看到HTML 5在精简旧有结构上做出的努力.DOCTYPE在出现之初主要用于XML中,用作描述XML允许使用的元素.属性和排列方式.起初HT ...

  6. [转贴]JAVA:RESTLET开发实例(二)使用Component、Application的REST服务

    上一篇文章,我们介绍了基于JAX-RS的REST服务,本篇文章我们介绍不基于JAX-RS的模式.JAX-RS其实就是一个简单的 Application服务.和我们接下来介绍的Application基本 ...

  7. Kotlin(2): 优雅地扩展类的方法和属性

    欢迎Follow我的GitHub, 关注我的CSDN. 个人博客: http://www.wangchenlong.org/, 最新内容. Kotlin由JetBrains公司推出, 是兼容Java的 ...

  8. [ios]objective-c中Category类别(扩展类)专题总结

    本文转载至 http://yul100887.blog.163.com/blog/static/20033613520126333344127/   objective-c类别的作用?通过类别的方式, ...

  9. 【eclipse插件开发实战】 Eclipse插件开发5——时间插件Timer开发实例详解

    Eclipse插件开发5--时间插件Timer开发实例详解 这里做的TimeHelper插件设定为在菜单栏.工具栏提供快捷方式,需要在相应地方设置扩展点,最后弹出窗体显示时间. 在上一篇文章里创建好了 ...

随机推荐

  1. .Net 数组去除重复项

    string str = "1/1/12/13/15/16/15//"; ] { '/' }, StringSplitOptions.RemoveEmptyEntries); Li ...

  2. 弹出窗口a标签写下载,再弹出窗口

    如果这个窗口是弹出出口,直接<a href="">点击下载<a>是不行的,得用js这样写,弹出并关闭,不然会回到首页,如果没有定义首页会报错,<a h ...

  3. C++ template学习一(函数模板和模板函数)

    函数模板和模板函数(1)函数模板函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计.它的最大特点是把函数使用的数据类型作为参数.函数模板的声明形式为:templat ...

  4. Struts2拦截器总结

    拦截器的本质: 拦截器就是一个类,一个实现了超级接口Interceptor的类.Interceptor接口里定义了三个方法 init(),destory(),intercept().其中inercep ...

  5. ORA-01045: user XXZY lacks CREATE SESSION privilege; logon denied

    在创建用户时,一般我们都分配connect.dba.resource 角色,但是,为什么登陆时还报错呢 原因:用户角色没有激动 解决:ALTER USER XXXX DEFAULT ROLE &quo ...

  6. poj 1091 跳骚

    /** 题意: 求对于小于m的n个数, 求x1*a1 + x2*a2+x3*a3........+xn*an = 1 即求 a1,a2,a3,....an 的最大公约数为1 , a1,a2....an ...

  7. IOS 特定于设备的开发:使用加速能力“向上定位”

    iPhone提供了3个机载的传感器,用于沿着iPhone的3根相互垂直的轴(左/右(x轴).上/下(y轴)和前/后(z轴))度量加速能力.这些值指示作用于iPhone的力,它们来自重力和用户移动.可以 ...

  8. android小知识之SparseArray(HaspMap替换)

    最近编程时,发现一个针对HashMap<Integer, E>的一个提示: 翻译过来就是:用SparseArray<E>来代替会有更好性能.那我们就来看看源码中SparseAr ...

  9. 如何使用沉浸式状态栏,让你的app风格更好看

    大家都知道,传统的手机状态栏非黑即白,经常让整个app显得不是那么的好看,如何让状态栏的颜色跟你整个界面的颜色能够融为一体,这是我们一直想要的,现在给大家展示一下: 由图可见,第一张是没有使用沉浸式状 ...

  10. css 自适应布局

    转载一篇文章: 自适应网页设计(Responsive Web Design) 作者: 阮一峰 移动设备正超过桌面设备,成为访问互联网的最常见终端.于是,网页设计师不得不面对一个难题:如何才能在不同大小 ...