こんばんは。
Phalcon PHP Frameworkという元はPHPの拡張で書かれたフレームワークがあります。
このフレームワークはZephirと呼ばれるPHPライクな感じで書く言語で書かれています。
なぜこの記事を書いたのか
残念なことに、phalconのドキュメントは更新が遅いので新しく入った機能を使いたくなった場合、ドキュメントだけでは分からないので結局PRなどからzepのソースを読むことになるのです。
また、少し関係ないですが公式のドキュメントも日本語化されている方はページによってはmarkdownが崩れていたりと辛かったりします。(結局英語ドキュメントを見たほうが良いことに)
なお、Phalconは予定では6からPHPソース版がリリースされるので、今後は読むのは楽になると思います。
ソースはどこにあるのか
ソースは以下にあります。
2021/05/03現在、このリポジトリのphalconディレクトリにコアコードが置かれています。
読み方
まあ実際にzepという拡張子(Zephir言語で書かれたもの)は結構PHPライクなもので書かれているのでそこまで困らないと思います。(内部ソースを見るに、phpの関数も呼べるようです。)
ちょっとメソッドを少し見てみましょう。Logger.zepのlog関数です。
/**
* Logs with an arbitrary level.
*
* @param mixed level
* @param string message
*/
public function log(level, message, array context = []) -> void
{
var intLevel;
let intLevel = this->getLevelNumber(level);
this->addMessage(intLevel, (string) message, context);
}
phpdocみたいなのも書かれていますし、まさにPHPみたいな感じです。
ただし気になるところとして、var
とlet
があります。
var
は動的変数の定義です。Zephirでは変数定義が必要です。
そして、let
は変数の初期化に使われます。
一応、一緒に初期化することも出来ますが(var a = "aaa"
)、phalconのソースではあまり見受けられません。
Zephirのドキュメントは以下にあります。
ちょっと面倒なこと
これはphalconのソースなのですがphalconに問題があったときに、phalconに問題があるのか、zephirに問題があるのかを追っかけないと分からないです。(つらい)
PHPの拡張であるものの、PHPとは若干異なる次元で動いてるためReflectionなどに影響があるときがあります。
普段の開発では
普段の開発だと、毎回毎回ドキュメントを追っかけることは流石にきついので、phalconにはide-stubs
と呼ばれるIDE用のスタブがライブラリとして存在します。(LaravelのIDE helper的なやつです)
このide-stubsは、zephirのソースにある
https://github.com/zephir-lang/zephir/blob/development/Library/Stubs/Generator.php
が生成を行います。
現状では自動で生成してpushされるような状態になっていないので、最新のものが出たとしても待つ必要があります。
また、zephir側の静的解析が雑な関係で部分的に返却する型や引数の情報がコアソースと異なる場合があるので注意しましょう。(早く色々解決してほしい)
しかしながら無いよりはすごく助かるスタブなので、もしphalcon使っていて入れてない人は入れたほうが良いでしょう。