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

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

0x00 定义 PHP 类

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

  • 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 实现类方法

方法与属性、常量不一样,属性、常量添加后不须要再进行额外的操做。类方法,须要编写实际的逻辑代码。redis

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

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

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交互操做。this

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\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)。执行后返回方法调用的结果。code

能够判断结果是否为true,来验证链接是否正确创建。server

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

PHP-X中不只能够建立PHP扩展内置的类,还能够建立PHP代码定义的类。

include("/data/webroot/Test.class.php");
Object testObj = newObject("Test", 123, 456, "hello");
相关文章
相关标签/搜索