2012-03-19 68 views
15

我正在爲個人項目創建a PHP extension。除了什麼是上述文章中鏈接的人,我沒有zend_engine的知識,我的C技能在10年以後的日期,並且是隻有永遠的學術。所有這些都是說「如果我好像在問一個愚蠢的問題,我可能就是」。從分機返回「原生」PHP對象

是否有可能在我自己的擴展中調用來自其他PHP擴展的函數,或者每個PHP擴展都被視爲一個孤島,而沒有深入瞭解系統的其他部分?如果這是可能的,這是常見做法還是壞主意?

也就是說,我知道我可以返回一個像這樣的字符串。

PHP_FUNCTION(hello_world) 
{ 
    char *str; 
    str = estrdup("Hello World"); 
    RETURN_STRING(str, 0); 
} 

我希望能夠返回,例如,一個SimpleXML元素或一個DomDocument元素。谷歌搜索已被證明是困難的,因爲關於擴展開發沒有太多的時間,並且標準的PHP使用量有很多。

+0

不錯的問題;如果Zend文檔沒有說明這一點,我會很驚訝。 – 2012-03-19 16:37:00

+1

@KerrekSB這是一個很好的RTFM :)。如果你(或任何人)知道一個很好的概述這個zend文檔,並且不承擔5年以上的擴展黑客體驗(甚至是一個),我很樂意看到它。 – 2012-03-19 16:54:38

回答

4

是,擴展其實可以依靠別人。他們可以:其它擴展全球註冊

  • 使用的資源,如類類型或PHP函數(也就是,他們沒有比用戶腳本的土地機會少,能明顯使用這些資源)。見zend_call_functionzend_lookup_class_ex
  • 使用在文件php_extensionname.h中聲明的任何導出的符號和結構(這些頭是唯一被認爲將本機API導出到其他擴展的頭)。然而,一些擴展可能實際上不出口這些頭文件中聲明一些符號,你必須尋找與PHPAPI聲明符號。請注意,某些分機不能被停用,你能依靠他們存在(例如,爲5.3/5.4,標準,SPL,反射,日期,PCRE,額日格)。
  • 如果您的擴展和目標擴展都是靜態構建的,那麼您可以使用更多的符號範圍,但使用非導出符號不是一個好習慣。

我希望能夠返回,比如說,一個SimpleXML的元素,或者一個DOMDocument元素。

如果你需要顯式實例化SimpleXMLElementDOMDocument,你可以用object_init_ex這樣做。擴展通常導出必須通過宏觀的zend_class_entry *,但如果沒有,你可以隨時使用zend_lookup_class_ex。這確實調用構造函數,所以你仍然必須手動,如果你需要做的。

一些擴展可能會提供一個本地接口來實例化和初始化一個對象,但通常擴展並不準備讓其他擴展實例化它們的類型。

當然,您也可以像腳本一樣調用PHP函數和返回這些類型的方法。你會得到一個zval *,你可以從你的函數返回。

至於如何聲明依賴關係,擴展描述符爲此具有entry。這將確保您的擴展程序在您聲明依賴的擴展程序之後加載。要在編譯時聲明依賴關係,請參閱PHP_ADD_EXTENSION_DEP

2

如果你正在寫擴展名,那麼Extending and Embedding PHP(又名「薩拉的書」)是必不可少的閱讀材料。現在有點過時了,但是你可以在網上找到或者關閉最好的資源。