Zephir入門 - Hello world篇
Zephir 是一個開源的用于簡化PHP擴展的創建和維護的語言。它使得不擅長C/C++的PHP開發人員也能寫出PHP擴展。Zephir是Zend Engine/PHP/Intermediate縮寫,讀音為zephyr。
Zephir在語法上跟PHP有很多相似之處,PHP開發人員可以很快上手,但也有很多地方上的不同需要我們去學習。下面是Zephir一些主要的特色:
- 變量類型:動態/靜態
- 內存安全:不允許指針和直接的內存管理
- 編譯模型:AOT(ahead of time)
- 內存模型:task-local垃圾回收
安裝
依賴
要使用Zephir和編譯出一個PHP擴展,需要先安裝以下的依賴:
- gcc >= 4.x/clang >= 3.x
- re2c 0.13+
- gnu make 3.81+
- autoconf 2.31+
- automake 1.14+
- libpcre3
- php development headers and tools
安裝
這里選擇使用git的方式獲取源代碼并進行安裝:
bash$ git clone https://github.com/phalcon/zephir $ cd zephir $ ./install-json $ ./install -c
如果已經安裝了json-c,那么可以忽略./install-json這一步。
驗證
通過運行zephir命令驗證下是否安裝成功:
bash$ zephir help _____ __ _ /__ / ___ ____ / /_ (_)____ / / / _ \/ __ \/ __ \/ / ___/ / /__/ __/ /_/ / / / / / / /____/\___/ .___/_/ /_/_/_/ /_/ Zephir version 0.7.1b Usage: command [options] Available commands: stubs Generates extension PHP stubs install Installs the extension (requires root password) fullclean Cleans the generated object files in compilation build Generate/Compile/Install a Zephir extension generate Generates C code from the Zephir code clean Cleans the generated object files in compilation builddev Generate/Compile/Install a Zephir extension in development mode compile Compile a Zephir extension version Shows the Zephir version api [--theme-path=/path][--output-directory=/path][--theme-options={json}|/path]Generates a HTML API help Displays this help init [namespace] Initializes a Zephir extension Options: -f([a-z0-9\-]+) Enables compiler optimizations -fno-([a-z0-9\-]+) Disables compiler optimizations -w([a-z0-9\-]+) Turns a warning on -W([a-z0-9\-]+) Turns a warning off
我們的第一個擴展
下面我們使用Zephier來創建一個“hello world”擴展。
初始化
首先,我們使用init命令來初始化擴展的基本結構(假設我們擴展的名稱為“utils”):
bash$ zephir init utils
成功運行后,我們應該會得到如下的目錄結構:
bashutils/ ext/ utils/
ext目錄里放的是編譯器需要用到的代碼,不用理會,我們的Zephir代碼將放在跟擴展名同名的utils里。
編寫代碼
我們在utils目錄下創建一個文件:greeting.zep,并編寫代碼:
phpnamespace Utils; class Greeting { public static function say() { echo "hello world!"; } }
這里不深入Zephir的語法,但是可以看到語法跟PHP很類似,上面的代碼定義了一個類Greeting和一個方法say()。
Zephir的語法詳情可以參考官方的文檔: http://zephir-lang.com/language.html 。
編譯
接下來,我們回到utils根目錄下并運行build命令編譯出擴展:
bash$ zephir build Preparing for PHP compilation... Preparing configuration file... Compiling... Installing... Extension installed! Add extension=utils.so to your php.ini Don't forget to restart your web serverp
編譯成功后,我們在PHP配置文件里增加以下一行:
iniextension=utils.so
驗證
通過如下命令查看我們的擴展是否正常加載:
bashphp -m [PHP Modules] ... memcached mysql mysqli mysqlnd openssl utils ...
如果看到我們擴展的名字,則證明已成功加載。
然后我們在PHP里調用say()方法:
php<?php echo Utils\Greeting::say(), "\n";
正常的話會輸出:hello world!。至此我們也完成了我們的第一個擴展。