接下来,本文开始在扩展中实现类定义和对象操作。 基于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 实现类方法
该方法与属性和常量不同。 添加属性和常量后,不需要进行额外的操作。 在类方法中,需要编译实际的逻辑代码。
只需使用 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 读取类常量
使用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");
//连接 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 代码定义的类。
include("/data/webroot/Test.class.php");
Object testObj = newObject("Test", 123, 456, "hello");
--------------大分割线----------------
PHPFamily(phpfamily)是由一群靠谱的人打造的,愿意给PHPer带来一些值得细细品味的精神食粮!
范迷莉只发表原创或授权文章,不转载网络文章
所有发表的文章均可找到原作者进行交流。
也希望大家多多给予打赏(算作对文章作者的报酬),也希望大家多投票。
请联系:
shenzhe163@gmail.com