プログラマー日記(2005-08-09)

なおRailsは、Rubyという言語の特徴を最大限に生かし、またJavaのフレームワークを参考にせず設計されています。PHPのフレームワークも、Javaのさるまねに陥ることなく、PHPの良さとは何かを考えながら、製作していただけたらと思います。

PHPの良さとは何か!

おれの考えたPHPの良さ:

  1. 関数いっぱい
  2. HTMLに埋め込める
  3. オブジェクト指向とか知らなくても作れる

それをフレームワークに生かせないかということで、一発ネタのはずだったAwesomeFrameworkをちょっと変えてみました。

AwesomeFramework-0.5.0.tar.gz

1.関数いっぱい

AwesomeFramework(以下AF)は関数のみ!(クラスとか無い)

  • forward($action) : アクションを実行する。(処理が移る)
  • redirect($action) : アクションにリダイレクトする。(別リクエストになる)
  • fetch($action) : アクションの実行結果の出力を取る。

2.HTMLに埋め込める

AF標準のRendererはPHP!
いままでは「HTMLに埋め込める機能いらねぇ」とか思ってましたが、たとえば単に

Hello World!

と書いたテキストに拡張子「.php」をつけてincludeすると全内容が勝手に出力される!
PHPタグの外側は勝手に出力される=PHPタグが無いテキストは全部が普通に出力される。

3.オブジェクト指向とか知らなくても作れる

AFのactionはただのPHPファイル。関数ですらなく、上から順番に実行されます!

Hello Worldアプリのaction:

<?php
$_REQUEST["message"] = "Hello World";
forward("view");
?>

PHPファイルにするとグローバル変数地獄になって大変だろうと思っていたんですが、全てのactionはforward関数内でincludeされるのでフィルタチェイン的構造になったforward関数のスコープになって何気にnamespaceが分かれてる!

ファイルをactionの単位として$selfというそのaction自身の情報を含んだ変数をインポートすることにしました。($thisだと混乱するのでPerl的な$self)

$selfの中身:

Array
(
    [action] => index
    [file] => index.php
    [abs_path] => D:/Program Files/eclipse-3.0.2/workspace/AwesomeFramework/actions/index.php
    [abs_uri] => http://localhost/index.php?action=index
    [resource] => Array
        (
        )
)

やっべえこのハンドルネーム、じわじわくるよ・・・。

robots.png

オブジェクト指向JavaScript

クロージャとはブロック化されたコードの事です。その特徴はクロージャが生成されたスコープのローカル変数を取り込むことができる、というものです。

JavaScriptでのクロージャの話。PHPだと馴染み浅ですが、楽しいし便利!

pharanの日記

というか、この期に及んで、会社から公式にまだ一度も音信がないのですが。こちらから書面以外で連絡を取る気はありません(口頭で変な口約束交わしたくないし、襲ってきた本人に会うなんてもってのほか)。その旨も内容証明郵便で通知済み。

すごい詳細が気になる。

窓の杜 – 【NEWS】商標権侵害のためメールソフト「鶴亀メール」が「秀丸メール」に名称変更

定番テキストエディター「秀丸エディタ」を開発する(有)サイトー企画は9日、同社製メールソフト「鶴亀メール」を「秀丸メール」に名称変更することを発表した。これは、今月2日に“鶴亀”の商標権者から同社へ通知が届き、「鶴亀メール」が他社の商標権を侵害していたことが判明したため。

先にHidemarnet Explorerを改名すべき。

本家フォーラムの方で少し要望が出たのでMojaviInfoを修正しました。

MojaviInfo-0.4.tar.gz

version 0.4の変更点

  • NOTICEが出る部分を修正。
  • Subversionディレクトリ、emacs, viなどのbackupファイルを一覧から除外。

ref: MojaviInfo

PECL :: Package :: sdo

Service Data Objects (SDOs) enable PHP applications to work with data from different sources (like a database query, an XML file, or a spreadsheet) using a single interface.

IBM提供のextention、sdoがバージョンアップ。

descriptionが変わってる!
すごいなんか分かりやすくなってる!

ヘテロジーニアスなデータじゃわかりずらいものな。

ref: PECL sdo

Mojaviについての質問をまたもらったので回答。
内容は、 「Mojavi+SmartyでHTMLファイルを吐きたいが、Viewの中でRendererをいじってもイマイチうまくいかない」 というものです。

「ActionでSmartyRendererを使う」または「ActionChainを使う」 という方法はどうだろうか。

普通に作っておいて、ファイルに吐く必要が出たら 簡単に移行できるので後者がいいような気がする。

StaticHtml-0.1.tar.gz

[ ActionでSmartyRendererを使う ]

<?php
include_once(dirname(BASE_DIR)."/mojavi/lib/smarty/Smarty.class.php");
include_once(OPT_DIR."renderers/SmartyRenderer.class.php");

class CreateHtmlAction extends Action {
    function execute(&$controller, &$request, &$user) {
        $renderer =& new SmartyRenderer($controller, $request, $user);
        $engine =& $renderer->getEngine();
        $engine->compile_dir = BASE_DIR."/templates_c";
        $engine->compile_id = $controller->currentModule."_".$controller->currentAction;
        $renderer->setTemplate("static.html");
        $renderer->setAttribute("title", "Static HTML by SmartyRenderer");
        $renderer->setMode(RENDER_VAR);
        $fp = fopen("staticHtmlBySmartyRenderer.html", "w");
        fwrite($fp, $renderer->fetchResult($controller, $request, $user));
        fclose($fp);
        header("Location: ".dirname(SCRIPT_PATH)."/staticHtmlBySmartyRenderer.html");
        return VIEW_NONE;
    }
}
?>

[ ActionChainを使う ]

<?php
class CreateHtmlAction extends Action {
    function execute(&$controller, &$request, &$user) {
        $actionChain =& new ActionChain();
        $actionChain->register("getHtml", "CreateHtmlByActionChain", "GetHtml");
        $actionChain->execute($controller, $request, $user);
        $fp = fopen("staticHtmlByActionChain.html", "w");
        fwrite($fp, $actionChain->fetchResult("getHtml"));
        fclose($fp);
        header("Location: ".dirname(SCRIPT_PATH)."/staticHtmlByActionChain.html");
        return VIEW_NONE;
    }
}
?>

ref: 本当に理解すること

Java魂―プログラミングを極める匠の技

毎週日曜日、ラーメン食いながらちょっとづつ読んでたJava魂やっと読了。

不変オブジェクトやコレクションの話など、地味だけど現場では大変重要なお話がためになります。ロジックエラーをコンパイラが検出できるエラーに変えてこうというテクニックが多いんですが、PHPでは関係無いわな。
最後の方の参照とかは難しくて読むのが辛かった!