LoginSignup
6
0

More than 5 years have passed since last update.

Zephirで作ったPHP Extensionもコード補完したい

Posted at

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

動作環境

インストール

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部分をテストしてない(スキップしてる)
6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0