🐸

独自のPHP フレームワークを作成するという冒険 (2)

2024/12/08に公開

衝動のままに突っ走る

この辺りで自分で思い描いた理想の概念構造体を創り上げる、という衝動を味方につけないと、ゴールまで辿りつけません。ワイが理想のフレームワーク作ったる、と心のどこかで思ってるわけですから、ある程度自由にさせたほうがよいです。

自分が創造主となる甘美な行為に没入するスタートは、フレームワークに名前を与えるという儀式です。
自分が好きな物で、チャームがあって、あまり他では使ってないものということで、子供の頃に好きだったアマガエルの英語名であるrainfrogにしました。

ネットミームの、構想を練るエンジニアのイメージともタブります。環境変化に敏感で、かよわく、健気で、決して挫けない思慮深い、それが(私の考える)エンジニアです。

さらに、衝動を味方につけるために、プログラムの根幹部分を実装してみることにしました。
https://github.com/yukihiro-asami/rainfrog/blob/main/frog/loader/web.php

<?php
//loeaderのファイルをロードする
include('libs/load.php');

//利用する関数クロージャー名をテキストで定義する
$commands = <<<EOF
get_syslog_id
capture_dir
config_setup
//中略
EOF;

//グローバル変数を定義する
/** @noinspection DuplicatedCode */
$__mode = FRG_MODE_WEB;
$__results = [];
$__vals = [];
$__body = '';
$__protocol = 'HTTP/1.1';
$__status = FRG_HTTP_STATUS_CODE_200_OK;
$__headers = [];
$__cookies = [];
$__dbs = [];
$__db_logs = [];
$__credential = NULL;
$__upload_files = [];

//関数クロージャーを一つ一つ実行する
foreach (explode(PHP_EOL, $commands) as $command)
{
    $closure = include('closures/' . $command . '.php');
    $__results[$command] = $closure($__vals);
}

※これは完成系ですが、とりあえず骨組みを作って、Webからアクセスして応答するところまで実装したということです。

プログラムのエントリーポイントから、ブートストラップ(自己開始の工程)の工程をへているところが、難読化しやすいので、関数と関数クロージャーで部品化することにしました。

依頼主のいないプロジェクトを完結する方法は、自画自賛をちょいちょい挟むことです。寛大な読者の方に甘えて、これいいなと思ったポイントを挙げておきます。本来は独り言に留めておくべきでありまして、これを開陳するのは結構恥ずかしいです。

自画自賛ポイント その1
複雑化しやすいエントリーポイントがよく整理整頓されている。関数を読んで、グローバル変数を定義して、関数クロージャーを順番に実施し、結果を連想配列に格納する、終わり

自画自賛ポイント その2
結果の連想配列は、再代入できないようにしていて、システムログとして取得できるようにしている

自画自賛ポイント その3
グローバルにシングルトンのインスタンスと連想配列格納する変数を用意している。グローバル領域に変数を置くのはアンチパターンだが、こういうふうに整理しておけば問題は少ない

自画自賛ポイント その4
オブジェクト指向で組むことに拘泥せず、自己立ち上げのプロセスを関数と関数クロージャーを順番に実施することで行っている。これにより、密結合したクラス群を作り出すことなく、エレガントに問題を解決している。

クリーンなアーキテクチャーを最初に組み立て、関数と関数クロージャー、インターフェイスのクラスを作れば終わりという状態になりました。

最小限で実装してみると、仕様を整理すればプロジェクトの工数全体はそんなに大きくならない予想され、現在のプロジェクト管理の合間に少しづつ作れば完成することがわかってきました。

Discussion