查看: 1165|回复: 0

[PHP代码] PHP-X 系列教程:扩展内定义类和对象

发表于 2017-10-12 08:00:04
句号论坛

接着上一篇文章,本文开始在扩展内实现类的定义和对象操作。基于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添加类常量
  1. PHPX_EXTENSION()
  2. {
  3. Extension *ext = new Extension("test", "0.0.1");
  4. ext->onStart = [ext]
  5. {
  6. Class *c = new Class("CppClass");
  7. //注册构造方法
  8. c->addMethod(PHPX_ME(CppClass, __construct), CONSTRUCT);
  9. //普通方法
  10. c->addMethod(PHPX_ME(CppClass, test1));
  11. //普通方法
  12. c->addMethod(PHPX_ME(CppClass, test2), STATIC);
  13. //添加默认属性
  14. c->addProperty("age", 30);
  15. //添加常量
  16. c->addConstant("VERSION", "1.9.0");
  17. //注册类
  18. ext->registerClass(c);
  19. };
  20. return ext;
  21. }
复制代码
0x01 实现类方法

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

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

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

  1. PHPX_METHOD(CppClass, __construct)
  2. {
  3. echo("%s _construct\n", _this.getClassName().c_str());
  4. Array array;
  5. array.append(1234);
  6. _this.set("name", array);
  7. }
  8. PHPX_METHOD(CppClass, test1)
  9. {
  10. //读取全局变量
  11. Variant server = global("_SERVER");
  12. var_dump(server);
  13. if (server.isArray())
  14. {
  15. Variant shell = Array(server)["SHELL"];
  16. var_dump(shell);
  17. }
  18. auto name = _this.get("name");
  19. var_dump(name);
  20. }
复制代码
0x02 读写属性 调用_this.get(property_name)读取对象属性的值 调用_this.set(property_name, value)设置对象属性的值 0x03 读取类常量

使用constant函数获取类常量。

  1. auto value = constant("CppClass::VERSION");
  2. var_dump(value); //输出 1.9.0
复制代码
0x04 编译
  1. make install
复制代码
0x05 运行
  1. $o = new CppClass();
  2. $o->test1();
复制代码
0x06 创建 PHP 对象

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

  1. Object redis = newObject("redis");
  2. //连接 Redis
  3. auto ret1 = redis.exec("connect", "127.0.0.1", 6379);
  4. //Get Key
  5. auto ret2 = redis.exec("get", "key");
  6. //打印字符串
  7. echo ("value=%s\n", 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,来验证连接是否正确建立。

  1. if (ret1.toBool()) {
  2. //连接成功
  3. } else {
  4. //连接失败
  5. }
复制代码

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

  1. include("/data/webroot/Test.class.php");
  2. Object testObj = newObject("Test", 123, 456, "hello");
复制代码


太阳http代理AD
回复

使用道具 举报

关闭

站长推荐上一条 /1 下一条