php 定义对象-PHP-X 教程:扩展定义的类和对象

2023-08-26 0 3,723 百度已收录

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

0x00 定义 PHP 类

底层的 ZendAPI 有一个限制:函数必须在模块初始化之前定义,类必须在模块初始化之后定义。 要为此定义一个类php 定义对象,需要在扩展的 onStart 反弹中完成。

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

该方法与属性和常量不同。 添加属性和常量后,不需要进行额外的操作。 在类方法中,需要编译实际的逻辑代码。

php 定义对象-PHP-X 教程:扩展定义的类和对象

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

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

PHPX_METHOD(CppClass, __construct)
{
    echo("%s _constructn", _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 读写属性

0x03 读取类常量

php 定义对象-PHP-X 教程:扩展定义的类和对象

使用constant函数获取类常量。

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


0x04 编译

make install


php 定义对象-PHP-X 教程:扩展定义的类和对象

0x05 运行中

$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=%sn", ret2.toCString());

newObject函数相当于PHP的new句型。 第一个参数是类名,第二个参数的长度是可变的,是构造方法的参数。 例如newObject("test",123,456,"hello")等价于newtest(123,456,"hello"),创建的对象是C++中的Object类型。

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

您可以检查结果是否正确,以验证连接是否正确建立。

if (ret1.toBool()) {
   //连接成功

} else {    
   //连接失败
}


在 PHP-X 中,除了创建 PHP 扩展类之外,您还可以创建由 PHP 代码定义的类。

php 定义对象-PHP-X 教程:扩展定义的类和对象

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

--------------大分割线----------------

PHPFamily(phpfamily)是由一群靠谱的人打造的,愿意给PHPer带来一些值得细细品味的精神食粮!

范迷莉只发表原创或授权文章,不转载网络文章

所有发表的文章均可找到原作者进行交流。

也希望大家多多给予打赏(算作对文章作者的报酬),也希望大家多投票。

请联系:

shenzhe163@gmail.com

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 php php 定义对象-PHP-X 教程:扩展定义的类和对象 https://www.wkzy.net/game/163012.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务