クラスの継承についてのまとめ
2008年11月16日
現在、リファクタリング中。今までのシステムでは、スキン変数・テンプレート変数について、XMLの記述でどのクラスのどのメソッドを呼び出すかを定義していた。この機能は、変数のオーバライドなどを行うには便利であるが、一方でデバッグを困難にしている。Nucleusのスキンの上位互換を保つのに必要な機能なのではあるが、それは別の方法(取り込む際に書き換える)で実現可能なのは、先日の記事で書いたとおり。
で、XMLの記述でどのクラスのどのメソッドを呼び出すかを定義する機能は残すものの、コアのライブラリのコードでは封印することにした。この機能は、プラグインでのみ使用することが推奨される(コアの機能をプラグインでオーバライドするのに必要)。
基本的に、スキン変数の記述は、例えば次のようにする。
<%xxx%>
<%xxx.yyy%>
<%xxx.yyy.zzz%>
<%xxx%>の場合、xxxクラスのdoSkinVarメソッドを呼び出す。<%xxx.yyy%>の場合、xxxクラスのskinvar_yyyメソッドを、<%xxx.yyy.zzz%>の場合は、xxx_yyyクラスの、skinvar_zzzメソッドを呼び出す。
つまり、上の3つの記述は、jitにより次のようにコンパイルされる。
<?php xxx::doSkinVar() ?>
<?php xxx::skinvar_yyy() ?>
<?php xxx_yyy::skinvar_zzz() ?>
ここで、doSkinVar()やskinvar_yyy()などは、クラスによっては必ずしも定義されていないから、その辺のエラーをどう処理するかが問題である。今のところ考えているのは、__call()メソッドを利用すること。doSkinVar()などが定義されていない場合は、<%xxx%>などをそのまま表示するようにすれば良いし、テンプレートでの使用の場合、doTemplateVar()が定義されていない場合、doSkinVar()が定義されていればそちらに制御を渡すようにすれば良い。ここのコードは、基底のjeansクラスに記述しておいて、すべてのライブラリクラスがjeansを継承するようにすれば、解決する。
クラスの親子関係も複雑になってきたので、ちょっとまとめてみた。

基底のクラスは、jeansとsql_baseの2つがある。sql_baseクラスは、SQLite/MySQL/pgSQLといった異なるデータベースに対応させるためのラッパーを記述するもの。jeansクラスは、上記機能やセキュリティー関連の基本機能を提供するためのものである。
sql_biosクラスはPDOエミュレータ専用で、異なるデータベースに対応させるためのラッパーを記述するためのもの。
ところで、<%xxx.yyy.zzz%>のような記述は、namespaceを多少意識している。こういった概念に対し、PHP5.3のnamespaceを割り当てるかどうかは未定。現在のところ、xxx_yyyクラスのskinvar_zzzといったように、クラス名を『_』をデリミタとして命名することで対処している。同時に、xxx_yyyクラスは、『libs/xxx/』ディレクトリの『xxx_yyy.php』で記述するようにし、これを__autoload()を用いてインクルードするように変更した(ver 0.2.1.0.4)。
で、XMLの記述でどのクラスのどのメソッドを呼び出すかを定義する機能は残すものの、コアのライブラリのコードでは封印することにした。この機能は、プラグインでのみ使用することが推奨される(コアの機能をプラグインでオーバライドするのに必要)。
基本的に、スキン変数の記述は、例えば次のようにする。
<%xxx%>
<%xxx.yyy%>
<%xxx.yyy.zzz%>
<%xxx%>の場合、xxxクラスのdoSkinVarメソッドを呼び出す。<%xxx.yyy%>の場合、xxxクラスのskinvar_yyyメソッドを、<%xxx.yyy.zzz%>の場合は、xxx_yyyクラスの、skinvar_zzzメソッドを呼び出す。
つまり、上の3つの記述は、jitにより次のようにコンパイルされる。
<?php xxx::doSkinVar() ?>
<?php xxx::skinvar_yyy() ?>
<?php xxx_yyy::skinvar_zzz() ?>
ここで、doSkinVar()やskinvar_yyy()などは、クラスによっては必ずしも定義されていないから、その辺のエラーをどう処理するかが問題である。今のところ考えているのは、__call()メソッドを利用すること。doSkinVar()などが定義されていない場合は、<%xxx%>などをそのまま表示するようにすれば良いし、テンプレートでの使用の場合、doTemplateVar()が定義されていない場合、doSkinVar()が定義されていればそちらに制御を渡すようにすれば良い。ここのコードは、基底のjeansクラスに記述しておいて、すべてのライブラリクラスがjeansを継承するようにすれば、解決する。
クラスの親子関係も複雑になってきたので、ちょっとまとめてみた。

基底のクラスは、jeansとsql_baseの2つがある。sql_baseクラスは、SQLite/MySQL/pgSQLといった異なるデータベースに対応させるためのラッパーを記述するもの。jeansクラスは、上記機能やセキュリティー関連の基本機能を提供するためのものである。
sql_biosクラスはPDOエミュレータ専用で、異なるデータベースに対応させるためのラッパーを記述するためのもの。
ところで、<%xxx.yyy.zzz%>のような記述は、namespaceを多少意識している。こういった概念に対し、PHP5.3のnamespaceを割り当てるかどうかは未定。現在のところ、xxx_yyyクラスのskinvar_zzzといったように、クラス名を『_』をデリミタとして命名することで対処している。同時に、xxx_yyyクラスは、『libs/xxx/』ディレクトリの『xxx_yyy.php』で記述するようにし、これを__autoload()を用いてインクルードするように変更した(ver 0.2.1.0.4)。