摘要:接着上一篇文章,本文开始在扩展内实现类的定义和对象操作。因此定义类,需要在的回调中进行。使用类名方法名即可。连接成功连接失败在中不仅可以创建扩展内置的类,还可以创建代码定义的类。
接着上一篇文章,本文开始在扩展内实现类的定义和对象操作。基于PHP-X提供的封装,使用C++语言可以轻松地实现一个PHP的类,还可以在C++代码中创建任意PHP对象,调用对象方法、读写对象的属性。
0x00 定义 PHP 类底层Zend API有一个限制,定义函数必须在模块初始化之前,定义类必须在模块初始化之后。因此定义类,需要在Extension的onStart回调中进行。
new Class 表示创建一个新的PHP类,参数为类的名称
调用Class对象的addMethod来添加方法,其中PHPX_ME(CppClass, test2),这里PHPX_ME是一个宏,展开是方法的名称和函数指针,第二个参数是方法的修饰符,可以是STATIC、PROTECTED、ABSTRACT等。可以使用按位或操作符设置多个修饰符,如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也有args和retval两个参数,分别用于处理PHP方法调用的参数和返回值。不同的是PHPX_METHOD多了一个_this对象,相当于PHP代码中的$this。注意如果是静态方法_this为null
PHPX_METHOD(CppClass, __construct) { echo("%s _construct ", _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.00x04 编译
make install0x05 运行
$o = new CppClass(); $o->test1();0x06 创建 PHP 对象
在PHP-X的扩展中还可以创建PHP对象,与PHP交互操作。
Object redis = newObject("redis"); //连接 Redis auto ret1 = redis.exec("connect", "127.0.0.1", 6379); //Get Key auto ret2 = redis.exec("get", "key"); //打印字符串 echo ("value=%s ", ret2.toCString());
newObject函数相当于PHP的new语法,第一个参数为类名,从第二个参数开始为变长,是构造方法的参数,如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");
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/25914.html
摘要:本文主要介绍内置函数的使用,在扩展开发中,会经常用到这些内置函数,的封装,使得调用这些函数像代码一样简单。的使用方法与语言的是完全一致的。包括的超全局变量和其他代码使用关键词声明的全局变量。 本文主要介绍PHP-X内置函数的使用,在PHP扩展开发中,会经常用到这些内置函数,PHP-X的封装,使得调用这些函数像PHP代码一样简单。 echo 在扩展中需要输出一些内容,可以使用echo函数...
摘要:四使用语言开发是我重点推荐的扩展开发框架,简明易懂,功能强大,开发效率高,代码易维护,执行速度快。优点三支持,的扩展开发有两套扩展开发框架,分别支持,,虽然框架代码有两个,但是接口却是一样的。 PHP扩展是高级PHP程序员必须了解的技能之一,对于一个初入门的PHP扩展开发者,怎么才能开发一个成熟的扩展,进入PHP开发的高级领域呢?本系列开发教程将手把手带您从入门进入高级阶段。本教程系列...
摘要:这里看到,表明你的扩展已经加载成功了,现在就可以调用这个扩展函数了。是不是很简单更多上面的例子还比较简单,只是编写了一个扩展函数。 PHP-X是我在2017年年初创建的一个新项目。这个项目的目标就是让有一定工作经验的PHP程序都能够具备扩展开发的能力。 0x00 初衷 从2012年开始编写swoole,现在算来已经有5个年头了。我发现编写一个 PHP 扩展这个工作非常艰难。PHP 程序...
摘要:总得来说,从大三开始到入职奇虎这年,一直处于自己探索阶段,各种折腾,浪费了不少青春,收获总得来说不是很大。入职奇虎之后,有了一份稳定的工作,从此一天当作两天来用,恶补我之前浪费的青春。 经过紧张的开发,我终于费了九牛二虎之力将 zendAPI 的项目官网做好上线了,眨眼已经入职奇虎一年了,我也走完了我的职业生涯规划的第一年,别问我之前4年干啥去了,我去潇洒了 (拉着几个大学同学创业去了...
阅读 2730·2021-11-24 09:39
阅读 1645·2021-09-28 09:35
阅读 1118·2021-09-06 15:02
阅读 1305·2021-07-25 21:37
阅读 2726·2019-08-30 15:53
阅读 3642·2019-08-30 14:07
阅读 713·2019-08-30 11:07
阅读 3510·2019-08-29 18:36