博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP-X 系列教程:扩展内定义类和对象
阅读量:6974 次
发布时间:2019-06-27

本文共 2572 字,大约阅读时间需要 8 分钟。

接着上一篇文章,本文开始在扩展内实现类的定义和对象操作。基于PHP-X提供的封装,使用C++语言可以轻松地实现一个PHP的类,还可以在C++代码中创建任意PHP对象,调用对象方法、读写对象的属性。

0x00 定义 PHP 类

底层Zend API有一个限制,定义函数必须在模块初始化之前,定义类必须在模块初始化之后。因此定义类,需要在ExtensiononStart回调中进行。

  • new Class 表示创建一个新的PHP类,参数为类的名称
  • 调用Class对象的addMethod来添加方法,其中PHPX_ME(CppClass, test2),这里PHPX_ME是一个宏,展开是方法的名称和函数指针,第二个参数是方法的修饰符,可以是STATICPROTECTEDABSTRACT等。可以使用按位或操作符设置多个修饰符,如STATIC | PUBLIC
  • 调用Class对象的addProperty添加属性
  • 调用Class对象的addConstant添加类常量
PHPX_EXTENSION(){    Extension *ext = new Extension("test", "0.0.1");    ext->onStart = [ext]    {        Class *c = new Class("CppClass");        //注册构造方法        c->addMethod(PHPX_ME(CppClass, __construct), CONSTRUCT);        //普通方法        c->addMethod(PHPX_ME(CppClass, test1));        //普通方法        c->addMethod(PHPX_ME(CppClass, test2), STATIC);        //添加默认属性        c->addProperty("age", 30);        //添加常量        c->addConstant("VERSION", "1.9.0");        //注册类        ext->registerClass(c);    };    return ext;}

0x01 实现类方法

方法与属性、常量不同,属性、常量添加后不需要再进行额外的操作。类方法,需要编写实际的逻辑代码。

使用PHPX_METHOD(类名, 方法名)即可。注意方法实现的代码必须在addMethod之前。

PHPX_FUNCTION函数相同,PHPX_METHOD也有argsretval两个参数,分别用于处理PHP方法调用的参数和返回值。不同的是PHPX_METHOD多了一个_this对象,相当于PHP代码中的$this注意如果是静态方法_thisnull

PHPX_METHOD(CppClass, __construct){    echo("%s _construct\n", _this.getClassName().c_str());    Array array;    array.append(1234);    _this.set("name", array);}PHPX_METHOD(CppClass, test1){    //读取全局变量    Variant server = global("_SERVER");    var_dump(server);    if (server.isArray())    {        Variant shell = Array(server)["SHELL"];        var_dump(shell);    }    auto name = _this.get("name");    var_dump(name);}

0x02 读写属性

  • 调用_this.get(property_name)读取对象属性的值
  • 调用_this.set(property_name, value)设置对象属性的值

0x03 读取类常量

使用constant函数获取类常量。

auto value = constant("CppClass::VERSION");var_dump(value); //输出 1.9.0

0x04 编译

make install

0x05 运行

$o = new CppClass();$o->test1();

0x06 创建 PHP 对象

PHP-X的扩展中还可以创建PHP对象,与PHP交互操作。

Object redis = newObject("redis");//连接 Redisauto ret1 = redis.exec("connect", "127.0.0.1", 6379);//Get Keyauto ret2 = redis.exec("get", "key");//打印字符串echo ("value=%s\n", ret2.toCString());

newObject函数相当于PHPnew语法,第一个参数为类名,从第二个参数开始为变长,是构造方法的参数,如newObject("test", 123, 456, "hello"),相当于new test(123, 456, "hello")。创建的对象在C++里类型为Object

调用exec函数可执行对象的方法,如redis.exec("connect", "127.0.0.1", 6379),就相当于是$redis->connect("127.0.0.1", 6379)。执行后返回方法调用的结果。

可以判断结果是否为true,来验证连接是否正确建立。

if (ret1.toBool()) {    //连接成功} else {    //连接失败}

PHP-X中不仅可以创建PHP扩展内置的类,还可以创建PHP代码定义的类。

include("/data/webroot/Test.class.php");Object testObj = newObject("Test", 123, 456, "hello");

转载地址:http://dyosl.baihongyu.com/

你可能感兴趣的文章
[题解]第十一届北航程序设计竞赛预赛——H.高中数学题
查看>>
内置对象Array及Array常见操作
查看>>
oracle 表字段新增、修改、删除、重命名以及表重命名
查看>>
Python连接MySQL之Python库pymysql
查看>>
Android 图文教学让你彻底理解activity启动模式
查看>>
串口发送数据处理——状态机方式
查看>>
PTA-BinarySearchTree BasicOperation
查看>>
spring boot 2.0 集成 shiro 和 pac4j cas单点登录
查看>>
docker swarm英文文档学习-4-swarm模式如何运行
查看>>
数据结构和算法——递归算法
查看>>
23.CSS边框与背景【下】
查看>>
用java编写简单Webserver,理解webserver的功能。
查看>>
Struts2的中文乱码问题处理
查看>>
androidstudio 之 svn配置 汇总
查看>>
html基本标签
查看>>
Ubuntu 12.04 安装 VMware Tools 找不到linux-headers 问题
查看>>
TP5 Tree类无限极分类
查看>>
阶段性总结-贪心算法
查看>>
C++namespace
查看>>
小程序初体验:手把手教你写出第一个小程序(一)
查看>>