単純フレームワークAwesomeFrameworkを更新。
変更点
- 依存性を緩やかにする仕組み追加
依存性を緩やかにするといってもDIではなく、ブルース・テイトが言っていた「Ruby などの言語では DI コンテナや AOP は必要ない」 のはなんでなんだろう?と思って考えてみました。
また見たほうが早いのでコード。
index.php(フレームワーク本体):
<?php
define("AF_DEFAULT_ACTION", "default");
define("VERSION", "0.8.1");
$vars = array();
<strong>$dependency = array();
include_once "dependency.php";</strong>
forward(isset($_REQUEST["a"]) ? $_REQUEST["a"] : AF_DEFAULT_ACTION);
function forward($action) {
<strong> extract($GLOBALS["dependency"]);</strong>
extract($GLOBALS["vars"]);
include "$action.php";
}
function fetch($action) {
ob_start();
forward($action);
$buffer = ob_get_contents();
ob_end_clean();
return $buffer;
}
function redirect($action) {
header("Location: index.php?a=$action");
}
function assign($name, $value) {
$GLOBALS["vars"][$name] = $value;
}
function assign_by_ref($name, &$value) {
$GLOBALS["vars"][$name] =& $value;
}
?>
dependency.php(設定ファイル):
<?php
include_once "SampleCalculator.php";
$dependency["Calculator"] = "SampleCalculator";
?>
SampleCalculator.php(ロジック):
<?php
class SampleCalculator {
function add($var1, $var2) {
return $var1 + $var2;
}
}
?>
default.php(アクション):
<?php
$calc = new $Calculator();
assign("result", $calc->add(1, 2));
forward("view");
?>
view.php(ビュー):
<html>
<head><title>Hello Calculator</title></head>
<body>
1 + 2 = <?=$result?>
</body>
</html>
依存性を排除するには動的型付け言語の場合、単に依存するクラス名を変数にして設定ファイルに出せばいいんじゃないだろうか?これだと制御は反転しないし、依存性は注入されない。だからDIコンテナは要らないってことなんじゃなかろうか。