接着上一篇文章,本文開始在擴展內實現類的定義和對象操做。基於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");