承接上一篇,本文开始在扩展中实现类定义和对象操作。基于PHP-X提供的封装,你可以很容易的用C++语言实现一个PHP类,也可以用C++代码创建任意PHP对象,调用对象方法,读写对象属性。0x00用于定义PHP类的底层ZendAPI存在限制。函数必须在模块初始化之前定义,类必须在模块初始化之后定义。因此,需要在Extension的onStart回调中定义类。newClass表示新建一个PHP类,参数为类名调用Class对象的addMethod添加方法,其中PHPX_ME(CppClass,test2),其中PHPX_ME为宏,展开为类名方法和函数指针的第二个参数是方法的修饰符,可以是STATIC、PROTECTED、ABSTRACT等。可以使用按位或运算符设置多个修饰符,例如STATIC|PUBLIC调用Class对象的addProperty添加属性调用Class对象的addConstant添加类常量PHPX_EXTENSION(){Extension*ext=newExtension("test","0.0.1");ext->onStart=[ext]{Class*c=newClass("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);};returnext;}0x01实现类方法和方法不同于属性和常量,属性和常量添加后不需要额外操作。类方法,需要编写实际的逻辑代码。只需使用PHPX_METHOD(类名,方法名)。注意方法实现代码必须在addMethod之前。与PHPX_FUNCTION函数一样,PHPX_METHOD也有两个参数args和retval,分别用于处理PHP方法调用的参数和返回值。不同的是PHPX_METHOD多了一个_this对象,相当于PHP代码中的$this。注意如果是静态方法_this为nullPHPX_METHOD(CppClass,__construct){echo("%s_construct\n",_this.getClassName().c_str());数组数组;array.append(1234);_this.set("name",array);}PHPX_METHOD(CppClass,test1){//读取全局变量Variantserver=global("_SERVER");var_dump(服务器);if(server.isArray()){Variantshell=Array(server)["SHELL"];var_dump(外壳);}autoname=_this.get("name");var_dump(name);}0x02读写属性调用_this.get(property_name)读取对象属性值调用_this.set(property_name,value)设置对象属性值0x03读取类常量使用常量获取类常量的函数。autovalue=constant("CppClass::VERSION");var_dump(value);//output1.9.00x04compilemakeinstall0x05run$o=newCppClass();$o->test1();0x06在PHP中创建PHP对象-X的扩展中也可以创建PHP对象来与PHP交互。Objectredis=newObject("redis");//连接Redisautoret1=redis.exec("connect","127.0.0.1",6379);//获取Keyautoret2=redis.exec("get","key");//打印字符串echo("value=%s\n",ret2.toCString());newObject函数相当于PHP的new语法,第一个参数是类名,第二个参数是变量Long是构造方法的参数,如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");ObjecttestObj=newObject("Test",123,456,"hello");
