接着上一篇文章,本文开始在扩展内实现类的定义和对象操做。基于PHP-X
提供的封装,使用C++
语言能够轻松地实现一个PHP
的类,还能够在C++
代码中建立任意PHP
对象,调用对象方法、读写对象的属性。php
底层Zend API
有一个限制,定义函数必须在模块初始化以前,定义类必须在模块初始化以后。所以定义类,须要在Extension
的onStart
回调中进行。web
new Class
表示建立一个新的PHP
类,参数为类的名称Class
对象的addMethod
来添加方法,其中PHPX_ME(CppClass, test2)
,这里PHPX_ME
是一个宏,展开是方法的名称和函数指针,第二个参数是方法的修饰符,能够是STATIC
、PROTECTED
、ABSTRACT
等。能够使用按位或操做符设置多个修饰符,如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; }
方法与属性、常量不一样,属性、常量添加后不须要再进行额外的操做。类方法,须要编写实际的逻辑代码。redis
使用PHPX_METHOD(类名, 方法名)
便可。注意方法实现的代码必须在addMethod
以前。shell
与PHPX_FUNCTION
函数相同,PHPX_METHOD
也有args
和retval
两个参数,分别用于处理PHP
方法调用的参数和返回值。不一样的是PHPX_METHOD
多了一个_this
对象,至关于PHP
代码中的$this
。注意若是是静态方法_this
为null
app
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); }
_this.get(property_name)
读取对象属性的值_this.set(property_name, value)
设置对象属性的值使用constant
函数获取类常量。函数
auto value = constant("CppClass::VERSION"); var_dump(value); //输出 1.9.0
make install
$o = new CppClass(); $o->test1();
在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
函数至关于PHP
的new
语法,第一个参数为类名,从第二个参数开始为变长,是构造方法的参数,如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");