PHP扩展开发之简单类开发

接下来我们要用扩展的形式实现以下类(演示环境:linux、php-5.5.34-src)

 1 <?php
 2 class Person
 3 {
 4     private $_name;
 5     public function getName()
 6     {
 7         return $this -> _name;
 8     }
 9     public function setName($name)
10     {
11         $this -> _name = $name;
12     }
13 } 

在PHP源码目录下

1 cd php-5.5.34-src
2 cd ext
3 ./ext_skel --extname=hdx  //生成hdx扩展骨架
4 cd hdx

1.修改config.m4

PHP_ARG_WITH(hdx, for hdx support,
[  --with-hdx             Include hdx support])

//把这两行前面的dnl去掉  大概在 10-12行

2.在hdx.h添加如下

PHP_METHOD(Person, __construct);
PHP_METHOD(Person, __destruct);
PHP_METHOD(Person, getName);
PHP_METHOD(Person, setName);

3.在hdx.c下方添加相应函数

 1 PHP_METHOD(Person, __construct) {
 2  php_printf("__construct called.");
 3 }
 4
 5 PHP_METHOD(Person, __destruct) {
 6  php_printf("__destruct called.<br/>");
 7 }
 8
 9 PHP_METHOD(Person, getName) {
10  zval *self, *name;
11  self = getThis();
12  name = zend_read_property(Z_OBJCE_P(self), self, ZEND_STRL("_name"), 0 TSRMLS_CC);
13  RETURN_STRING(Z_STRVAL_P(name), 0);
14 }
15
16 PHP_METHOD(Person, setName) {
17  char *arg = NULL;
18  int arg_len;
19  zval *value, *self;
20  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
21  WRONG_PARAM_COUNT;
22  }
23  self = getThis();
24  MAKE_STD_ZVAL(value);
25  ZVAL_STRINGL(value, arg, arg_len, 0);
26  SEPARATE_ZVAL_TO_MAKE_IS_REF(&value);
27  zend_update_property(Z_OBJCE_P(self), self, ZEND_STRL("_name"), value TSRMLS_CC);
28  RETURN_TRUE;
29 }

对上面的代码做一些解释:

A. 获取方法的参数信息,仍然使用zend_parse_parameters函数,与之前我们介绍过的一样;

B. 获取this指针(相对于PHP代码而言,在PHP扩展中仍然使用zval结构表示)使用getThis()函数;

C. 使用MAKE_STD_ZVAL宏申请并初始化一个zval结构,在PHP扩展中,所有的数据类型其实都是用zval结构来表示的,在本系列文章中我会单独写一篇来介绍zval。

D. 获取属性值使用zend_read_property()函数,使用zend_update_property()函数更新属性值。

4.在hdx.c 上方,初始化类:在扩展初始化函数中,注册并初始化类。

1 zend_class_entry *person_ce;
2
3 PHP_MINIT_FUNCTION(fetion_echo)
4 {
5     zend_class_entry person;       INIT_CLASS_ENTRY(person, "Person", fetion_echo_functions);
6     person_ce = zend_register_internal_class_ex(&person, NULL, NULL TSRMLS_CC);
7
8     zend_declare_property_null(person_ce, ZEND_STRL("_name"), ZEND_ACC_PRIVATE TSRMLS_CC); return SUCCESS;
9 }

使用INIT_CLASS_ENTRY宏初始化类,第二个参数指定类名,第三个参数是函数表。

5. 注册到函数:声明方法的参数,并注册到函数表中。

1 ZEND_BEGIN_ARG_INFO(arg_person_setname, 0)
2     ZEND_ARG_INFO(0, name)
3 ZEND_END_ARG_INFO() const zend_function_entry fetion_echo_functions[] = {
4     PHP_ME(Person, __construct, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
5     PHP_ME(Person, __destruct,  NULL, ZEND_ACC_PUBLIC|ZEND_ACC_DTOR)
6     PHP_ME(Person, getName,     NULL, ZEND_ACC_PUBLIC)
7     PHP_ME(Person, setName,     arg_person_setname, ZEND_ACC_PUBLIC)
8     {NULL, NULL, NULL} /* Must be the last line in fetion_echo_functions[] */ };

类方法参数的声明与之前我们函数参数声明方式一致,在注册类方法到函数表中时使用PHP_ME宏,而不是之前使用的PHP_FE宏。

ZEND_ACC_PUBLIC:指定方法的访问修饰符

ZEND_ACC_CTOR:指定该方法为构造函数

ZEND_ACC_DTOR:指定该方法为析构函数

6.安装

1 /usr/local/php/bin/phpize
2 ./configure --with-php-config=/usr/local/php/bin/php-config
3 make && make install

然后在PHP安装目录下修改php.ini把扩展添加上

7. 运行测试:编译安装扩展后,编写一段简单的测试脚本:

1 <?php
2 $person = new Person();
3 $person->setName("huangdongxi");
4 echo $person->getName().‘<br/>‘;

运行后可以看到如下输出,说明扩展工作正常:
__construct called.
huangdongxi
__destruct called.

时间: 2024-10-31 14:45:05

PHP扩展开发之简单类开发的相关文章

自定义标签库开发(简单标签开发)

实现Tag接口,BodyTag接口,IterationTag接口的标签开发技术一般称为传统标签开发技术. 实现SimpleTag接口的标签开发技术,一般称为简单标签开发技术. JSP2.0里新增了SimpleTag. 由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广, SUN公司为降低标签技术的学习难度,在JSP 2.0中定义了一个更为简单.便于编写和调用的SimpleTag接口来实现标签的功能.实现SimpleTag接口的标签通常称为简单标签.简单标签共定义了5

Android开发学习——简单类图

1.类A继承于类B    (B 是父类,A是 子类) 2.小汽车.自行车 实现车的接口 3.A中有B这个成员变量,单向关联 4.聚合,整体与部分的关系.has-a  B中的构造函数(或set方法)需要A作为传入参数. 公司与员工的关系 5.复合  组合,整体与部分的关系.contains-a  B中构造函数将A进行了实例化. 你和你的大脑  书和书页的关系. 组合>聚合>关联>依赖

请问各位教学用电子白板一般用什么工具开发?简单的开发流程?多谢

<p> 我希望每天都能像今天一样,浅蓝色的天空,映衬出浅蓝色的你,浅蓝色的我.还有我那颗为爱浅浅跳动的心.在六月份这个霉雨多发的季节里,能有这样不干不湿.不冷不热的天气,也不失为一种小幸福.借此之际,快快拿起手中的笔,写下崭,新的一天. 六月的清晨,一 有过一夜的,滂沱,今日的雨,娴静多了. 一直是一个喜欢安静的女子,此刻夏雨的微蒙,把万千嘈杂拒于那一帘清幽之外.一个人独处一隅,面对满城烟雨,静默的续绣着一幅未完的十字绣.在母亲离世的近两年时间里,习惯了一个人独处,一个人独自工作,独自一从深圳

用扩展开发一个PHP类

原文:http://my.oschina.net/mickelfeng/blog/122519?p=1 假设我们要用PHP扩展实 现一个类Person,它有一个private的成员变量$_name和两个public的实例方法getName()和setName(),可以用 PHP代码表示如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 <?php class Person {     private $_name;     public function getName()    

php扩展开发2--添加类

1.需要实现的细节 实现一个person类 实现一个doing方法和saying方法 2.第一个扩展 2.1创建类的扩展: [[email protected] ext]# cd /usr/local/src/php-7.0.3/ext [[email protected] ext]# ./ext_skel --extname=person   //运行ext_skel创建扩展的开发包 2.2 修改配置 [[email protected] ext]# vim person/config.m4

自己动手模拟开发一个简单的Web服务器

开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此事要躬行”,于是我们自己模拟一个简单的Web服务器来体会一下. 一.请求-处理-响应模型 1.1 基本过程介绍 每一个HTTP请求都会经历三个步凑:请求-处理-响应:每当我们在浏览器中输入一个URL时都会被封装为一个HTTP请求报文发送到Web服务器,而Web服务器则接收并解析HTTP请求报文,然后针对请求进行处理(返回指定的HTML页面

Oracle数据库中调用Java类开发存储过程、函数的方法

Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日  浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL,除此之外,还可以用时下最流行的编程语言Java来做开发.随着对oracle的了解越来越多,越来越禁不住oracle的诱惑,oracle技术真的是一门很有趣的学问.之前,我在博客中总结了挺多有关SQL.PL/SQL的,但是对于oracle数据库中Java类的调用却没有总结,也是因为之前不太会,这会儿总

MVVM开发模式简单实例MVVM Demo

本文主要是翻译Rachel Lim的一篇有关MVVM模式介绍的博文 A Simple MVVM Example 并具体给出了一个简单的Demo(原文是以WPF开发的,对于我自己添加的一部分会用红色标注) 现在开始: 在我看来,如果你使用的是WPF或Sliverlight来开发程序就应该使用MVVM设计模式.它是你的代码清晰明了并易于维护. 可问题是网上有很多有关MVVM模式的资源都有自己强大的实现方式.这里我将介绍最基础的MVVM设计模式的实现方法. MVVM  (是Model-View-Vie

应用程序框架实战十二:公共操作类开发技巧(初学者必读)

本文专门为初学者而写,因为很多初学者可能还不了解公共操作类的作用和封装技巧,大部分有经验的程序员都会把自己所碰到的技术问题整理封装成类,这就是公共操作类.公共操作类往往具有一些通用性,也可能专门解决某些棘手问题.公共操作类是应用程序框架的核心,主要目标是解决大部分技术问题.我将在本文介绍封装公共操作类的要点,供初学者参考. 开发公共操作类的原因 很多初学者会奇怪,.Net Framework提供的API相当易用,为何还要多此一举,进行一层封装呢.下面列举封装公共操作类的一些动机. .Net Fr