Zephirとは?
公式:Zephir Programming Language
PHPのエクステンションを作成する言語。
Zephir ---PHPによる構文解析---> C言語 ---gccによるコンパイル---> PHPエクステンション
ってなイメージ。
PHP最速のフレームワークとして名高いPhalconもZephirで書かれてます。
参考
※2014の記事です。
PHPを拡張する言語、Zephirについて
やりたかったこと
最近このZephirで遊んでるんですが、せっかく実用的なエクステンション作ってもIDEでコード補完できないのが割と辛いなーと思った。PhalconだとPhalcon IDE Stubsっていうコード補完用のPHPファイルが用意されているんだけど、自分で作ったエクステンションでもこういうのがほしくなった。
やったこと
Zephirファイルからコード補完用のPHPファイルを生成するやつ作りました。
GitHub: zephir-ide-helper
動作環境
- PHP >= 7.0
- Zephir Parser >= 1.1.0
インストール
Packagist 登録してます。
composer require prune-mazui/zephir-ide-helper
使い方
vendor/bin/zephir-ide-helper [-option] target
target
Zephirファイル(拡張子.zep) もしくはディレクトリを指定してください。
ディレクトリ指定した場合、そのディレクトリ以下にある拡張子がzepのファイルを全部処理します。
option
- -f(--file) ・・・ 出力するファイル名を指定します。(デフォルト: __zephir_ide_helper.php)
サンプル
namespace PruneMazui\ZephirSample;
/**
* Sample class Greeting
*/
class Greeting
{
protected message = "hello world" { set, toString };
/**
* constructor
*
* @param string optional message
*/
public function __construct(string message = null)
{
if message !== null {
let this->message = message;
}
}
/**
* Output Message to stdout
*/
public function say()
{
echo this->message;
}
}
↓
<?php
namespace PruneMazui\ZephirSample
{
/**
* Sample class Greeting
*/
class Greeting
{
protected $message;
public function setMessage($message)
{}
public function __toString()
{}
/**
* constructor
*
* @param string optional message
*/
public function __construct(string $message = null)
{}
/**
* Output Message to stdout
*/
public function say()
{}
}
}
感想
- 最初はZephirが吐き出すCのコード見てニヤニヤしてるだけだったのにどうしてこうなった・・・
- ためしにPhalconで補完ファイル作ってみたら4万行とかになった/(^o^)\
- 細かい言語仕様の違いに苦しめられた。(同じやつ2回useしても問題ないとかuseしてるものと今のクラス名が被っても問題ないとか)
- 可読性上げるためにインデントつけたり改行入れたりしたけどいらない気もしている。
残課題
- Zephir の言語仕様全部追いきれてない
- PHPDoc生成するところが大分やっつけで作ってしまった感がある
- 1ファイルに全部まとめるのでPhalconみたいな大きいプロジェクトだとファイルサイズが・・・ 分割して出力するオプションつけようかな?
- CIで動いてるテストケースはZephirParser部分をテストしてない(スキップしてる)