接着文章,本文开端在增添内完结类的界说和目标操纵。基于PHP-X供给的封装,应用C++说话能够轻便地完结一个PHP的类,还能够在C++代码中创造随意PHP目标,挪用目标法子、读写目标的属性。
0x00界说PHP类底层ZendAPI有一个束缚,界说函数务必在模块初始化以前,界说类务必在模块初始化以后。是以界说类,需求在Extension的onStart回调中实行。
newClass示意创造一个新的PHP类,参数为类的称呼
挪用Class目标的addMethod来增加法子,个中PHPX_ME(CppClass,test),这边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,test),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为null
PHPX_METHOD(CppClass,__construct){echo("%s_construct\n",_this.getClassName().c_str());Arrayarray;array.append();_this.set("name",array);}PHPX_METHOD(CppClass,test1){//读取全面变量Variantserver=global("_SERVER");var_dump(server);if(server.isArray()){Variantshell=Array(server)["SHELL"];var_dump(shell);}autoname=_this.get("name");var_dump(name);}
0x0读写属性
挪用_this.get(property_name)读取目标属性的值
挪用_this.set(property_name,value)配置目标属性的值
0x03读取类常量应用constant函数获得类常量。
autovalue=constant("CppClass::VERSION");var_dump(value);//输出1.9.0
0x04编译
makeinstall
0x05运转
$o=newCppClass();$o-test1();
0x06创造PHP目标
在PHP-X的增添中还能够创造PHP目标,与PHP交互操纵。
Objectredis=newObject("redis");//相连Redisautoret1=redis.exec("connect","17.0.0.1",);//GetKeyautoret=redis.exec("get","key");//打印字符串echo("value=%s\n",ret.toCString());
newObject函数相当于PHP的new语法,第一个参数为类名,从第二个参数开端为变长,是构造法子的参数,如newObject("test",13,,"hello")相当于newtest(13,,"hello"),创造的目标在C++里类别为Object。
挪用exec函数可施行目标的法子,如redis.exec("connect","17.0.0.1",),就相当因而$redis-connect("17.0.0.1",)。施行后返回法子挪用的完毕。
能够判定完毕是不是为true,来考证相连是不是确实确立。
if(ret1.toBool()){//相连胜利}else{//相连失利}
在PHP-X中不但能够创造PHP增添内置的类,还能够创造PHP代码界说的类。
include("/data/webroot/Test.class.php");ObjecttestObj=newObject("Test",13,,"hello");
--------------宏大的分裂线----------------
PHP饭米粒(phpfamily)由一群靠谱的人确立,愿为PHPer带来一些值得细细品尝的精力粮食!
饭米粒只发首创或受权发布的文章,不转载网上的文章
所发的文章,都可找到原做家实行疏通。
也渴望诸位多多打赏(当做稿费给文章做家),更渴望众人多多投搞。
投稿请联络:
shenzhe
gmail.