摘要:找找出別人擴(kuò)展真么寫的。這次主要說了下寫擴(kuò)展要準(zhǔn)備的一些基本知識。比如不同編譯方式這個(gè)你看別的擴(kuò)展源碼的時(shí)候就會(huì)注意到具體作用。后面再來慢慢學(xué)習(xí)老司機(jī)的各種姿勢。包括,函數(shù),函數(shù)參數(shù),函數(shù)返回值,對象,類,命名空間等等等。
PHP擴(kuò)展開發(fā)系列01 - 我要成為一名老司機(jī) 1. 關(guān)于擴(kuò)展的教程貌似挺全了,為啥還寫?
記錄下我寫擴(kuò)展的歷程
自認(rèn)為會(huì)寫的更容易理解
我的宗旨就是 "先用再識" 代碼寫著寫著就知道原理了 或者說邊寫邊學(xué), 邊學(xué)邊寫
2. 那么你首先要具備哪些預(yù)備知識? 答:你需要先過科目一C 為啥放第一位?
PHP 不會(huì)?那寫什么PHP擴(kuò)展?
PHP的編譯安裝
phpize 和 php-config 這個(gè)靠你們自己去了解了
關(guān)于PHP編譯 前期非必須,但是要知道的 (no-debug, non-zts, debug, zts)
問?搜? -- 有時(shí)候不一定要問或者搜才能找到解決的答案。
找! --- 找出別人擴(kuò)展真么寫的 (php-src/ext)。不但有答案,還有思想。
至于 PHP ZEND 原理啥的, 很重要, 很重要, 很重要, 但是這里暫時(shí)放一邊,沒事可以去了解了解。
3. 先看看剛上車的司機(jī)是什么樣的? (示例代碼) 最后有注釋版的代碼說明
這是一個(gè)很簡單的擴(kuò)展, 簡單到?jīng)]有功能
擴(kuò)展名稱 laosiji
目前看來 這只是一個(gè)只會(huì)裝B(啥都不會(huì))的司機(jī)
三個(gè)文件
config.m4
php_laosiji.h
laosiji.c
config.m4
PHP_ARG_ENABLE( laosiji, whether to enable laosiji support, [ --enable-laosiji Enable laosiji support] ) if test "$PHP_LAOSIJI" != "no"; then PHP_NEW_EXTENSION(laosiji, laosiji.c, $ext_shared) fi
php_laosiji.h
#define PHP_LAOSIJI_EXTNAME "laosiji" #define PHP_LAOSIJI_VERSION "1.0.0" // 加載config.h,如果配置了的話 #ifdef HAVE_CONFIG_H #include "config.h" #endif // 加載php頭文件 #include "php.h"
laosiji.c
#include "php_laosiji.h" // module entry zend_module_entry laosiji_module_entry = { #if ZEND_MODULE_API_NO >= 20010901 STANDARD_MODULE_HEADER, #endif PHP_LAOSIJI_EXTNAME, /* 擴(kuò)展名稱 */ NULL, /* Functions */ NULL, /* MINIT */ NULL, /* MSHUTDOWN */ NULL, /* RINIT */ NULL, /* RSHUTDOWN */ NULL, /* MINFO */ #if ZEND_MODULE_API_NO >= 20010901 PHP_LAOSIJI_VERSION, /* 擴(kuò)展版本 */ #endif STANDARD_MODULE_PROPERTIES}; #ifdef COMPILE_DL_LAOSIJI ZEND_GET_MODULE(laosiji) #endif5. 作為司機(jī)的一本基本開車動(dòng)作 (擴(kuò)展的編譯安裝等)
phpize
./configure 這里要注意下 php-config
make
make install
加載 .so 擴(kuò)展文件
6. 點(diǎn)火啟動(dòng) 試試我們的擴(kuò)展7. 小節(jié)差不多就到這里了。這次主要說了下寫PHP擴(kuò)展要準(zhǔn)備的一些基本知識。當(dāng)然有些人可能對上面提到部分概念沒深入了解。
比如 PHP不同編譯方式(debug, nts..)<這個(gè)你看別的擴(kuò)展源碼的時(shí)候就會(huì)注意到>、phpize、php-config 具體作用。
phpize、php-config 一定要注意,這里提醒你這回遇到坑。后面再來慢慢學(xué)習(xí)老司機(jī)的各種姿勢。包括,函數(shù),函數(shù)參數(shù),函數(shù)返回值,對象,類,命名空間等等等。
8. 注釋版代碼config.m4
dnl dnl 開頭的語句 屬于注釋內(nèi)容 dnl PHP_ARG_ENABLE 函數(shù)有三個(gè)參數(shù) dnl 第一個(gè)參數(shù) laosiji 擴(kuò)展名稱 (不用加引號) dnl 第二個(gè)參數(shù) 運(yùn)行 ./configure 腳本時(shí)顯示的內(nèi)容 dnl 第三個(gè)參數(shù) 調(diào)用 ./configure --help 顯示的幫助信息 dnl 最后去了接下 PHP_ARG_WITH 這里就先不提了 PHP_ARG_ENABLE( laosiji, whether to enable laosiji support, [ --enable-laosiji Enable laosiji support] ) if test "$PHP_LAOSIJI" != "no"; then dnl PHP_NEW_EXTENSION 函數(shù)聲明 擴(kuò)展的名稱、需要的源文件名、擴(kuò)展的編譯形式 dnl 第一個(gè)參數(shù) 擴(kuò)展的名稱 dnl 第 2 。。 n-1 個(gè)參數(shù) 需要的源文件名 dnl 最后的$ext_shared參數(shù)用來聲明這個(gè)擴(kuò)展不是一個(gè)靜態(tài)模塊,而是在php運(yùn)行時(shí)動(dòng)態(tài)加載的。 dnl 如果我們的擴(kuò)展使用了多個(gè)文件,便可以將這多個(gè)文件名羅列在函數(shù)的參數(shù)里,如: dnl PHP_NEW_EXTENSION(laosiji, laosiji.c, laosiji_2.c, laosiji_3.c, $ext_shared) PHP_NEW_EXTENSION(laosiji, laosiji.c, $ext_shared) fiphp_laosiji.h
// 定義 擴(kuò)展相關(guān)的宏 比如版本號 擴(kuò)展名稱等等。。 #define PHP_LAOSIJI_EXTNAME "laosiji" #define PHP_LAOSIJI_VERSION "1.0.0" // 加載config.h,如果配置了的話 #ifdef HAVE_CONFIG_H #include "config.h" #endif // 加載php頭文件 // 這個(gè) 很有必要哈 #include "php.h"laosiji.c
#include "php_laosiji.h" // module entry // 1. laosiji_module_entry 擴(kuò)展名稱_module_entry // 2. PHP_LAOSIJI_EXTNAME /* 擴(kuò)展名稱 */ // 3. PHP_LAOSIJI_VERSION, /* 擴(kuò)展版本 */ // 那些 NULL ? // 第一個(gè)你要記住 /* Functions */ 這行 想想 php 中的函數(shù) // 第二個(gè)你要記住 /* MINIT */ 想想 class && object // 第三個(gè)你要記住 MINIT MSHUTDOWN RINIT RSHUTDOWN MINFO 慢慢來 不著急 zend_module_entry laosiji_module_entry = { #if ZEND_MODULE_API_NO >= 20010901 STANDARD_MODULE_HEADER, #endif PHP_LAOSIJI_EXTNAME, /* 擴(kuò)展名稱 */ NULL, /* Functions */ NULL, /* MINIT */ NULL, /* MSHUTDOWN */ NULL, /* RINIT */ NULL, /* RSHUTDOWN */ NULL, /* MINFO */ #if ZEND_MODULE_API_NO >= 20010901 PHP_LAOSIJI_VERSION, /* 擴(kuò)展版本 */ #endif STANDARD_MODULE_PROPERTIES}; #ifdef COMPILE_DL_LAOSIJI ZEND_GET_MODULE(laosiji) #endif參考簡單擴(kuò)展 https://github.com/imlaosiji/...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/23046.html
摘要:上一篇擴(kuò)展開發(fā)引導(dǎo)文章中。這篇文章就開始介紹使用工具來生成擴(kuò)展項(xiàng)目文件注意這里的本身沒有這玩意,是我給自帶的起的別名這個(gè)工具就是還有點(diǎn)迷惑那不廢話了。至于其他參數(shù)自行了解。發(fā)現(xiàn)也是有這三個(gè)文件的。所以,不要質(zhì)疑自己。 上一篇擴(kuò)展開發(fā)引導(dǎo)文章中。創(chuàng)建了編寫擴(kuò)展的三個(gè)基本文件。或許你會(huì)有個(gè)疑問PHP沒有類似的自動(dòng)生成項(xiàng)目框架的工具嗎? 當(dāng)然有。這篇文章就開始介紹使用 php-ext-cli...
摘要:入門,第一個(gè)這是一門很新的語言,年前后正式公布,算起來是比較年輕的編程語言了,更重要的是它是面向程序員的函數(shù)式編程語言,它的代碼運(yùn)行在之上。它通過編輯類工具,帶來了先進(jìn)的編輯體驗(yàn),增強(qiáng)了語言服務(wù)。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺已經(jīng)到來了,總結(jié)過去的 2017,相信小伙們一定有很多收獲...
摘要:入門,第一個(gè)這是一門很新的語言,年前后正式公布,算起來是比較年輕的編程語言了,更重要的是它是面向程序員的函數(shù)式編程語言,它的代碼運(yùn)行在之上。它通過編輯類工具,帶來了先進(jìn)的編輯體驗(yàn),增強(qiáng)了語言服務(wù)。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺已經(jīng)到來了,總結(jié)過去的 2017,相信小伙們一定有很多收獲...
摘要:入門,第一個(gè)這是一門很新的語言,年前后正式公布,算起來是比較年輕的編程語言了,更重要的是它是面向程序員的函數(shù)式編程語言,它的代碼運(yùn)行在之上。它通過編輯類工具,帶來了先進(jìn)的編輯體驗(yàn),增強(qiáng)了語言服務(wù)。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺已經(jīng)到來了,總結(jié)過去的 2017,相信小伙們一定有很多收獲...
平日學(xué)習(xí)接觸過的網(wǎng)站積累,以每月的形式發(fā)布。2017年以前看這個(gè)網(wǎng)址:http://www.kancloud.cn/jsfron... 1. Javascript 前端生成好看的二維碼 十大經(jīng)典排序算法(帶動(dòng)圖演示) 為什么知乎前端圈普遍認(rèn)為H5游戲和H5展示的JSer 個(gè)人整理和封裝的YU.js庫|中文詳細(xì)注釋|供新手學(xué)習(xí)使用 擴(kuò)展JavaScript語法記錄 - 掉坑初期工具 漢字拼音轉(zhuǎn)換...
閱讀 2989·2023-04-25 21:23
閱讀 3022·2021-09-22 15:24
閱讀 862·2019-08-30 12:55
閱讀 2095·2019-08-29 18:42
閱讀 2607·2019-08-29 16:27
閱讀 943·2019-08-26 17:40
閱讀 2173·2019-08-26 13:29
閱讀 2604·2019-08-26 11:45