FAQ

テンプレートにPHPショートタグを使ってますか?非推奨なのではないですか?

LithiumのテンプレートはPHPのショートタグ(つまり<?=)を使っていることに気づいたかもしれません。心配しなくて構いません。これらは実際にPHPで解釈されることはありません。Lithiumは内部のテンプレートコンパイラを使ってこれらのタグを<?php echo ... ?>に変換しています。自動的にコンテンツをエスケープすることができるので、XSS攻撃に関して心配する必要がありません。また、コンパイラはヘルパーなどから渡されたコンテンツをちゃんと認識するので、2重にエスケープされてしまうことはありません。もっと詳しく知りたいのでしたらテンプレートシステムのドキュメントをチェックして見て下さい。

いろんな箇所でスタティックを使ってますが、テストしくくないでしょうか?

厳密に言えば、スタティックはテストしやすいのです。Lithiumフレームワークだけでなく、フレームワーク上に構築されたアプリケーションもテストし易くできるよう関数プログラミングからいくつかのコンセプトを拝借しています。これらのコンセプトの幾つかを理解する為には、まず2、3の用語を定義しなければなりません。

状態(ステート)

ソフトウエアを記述するにあたって本質的な部分になります。Wikipediaでは、「システムの様々な条件を計測したスナップショット」として"状態(ステート)"を定義しています。PHPアプリケーションの構築では、コンテキストやスコープによって異なりますが、index.phpを最初にロードした時にGETやPOSTデータ、$_SERVERや$_ENVに入っているシステム情報、その他のスーパーグローバル変数といったスクリプトをリクエストする為に使われるデータとして"状態(ステート)"が定義されます。"状態(ステート)"は日付や時間といった明示的ではないものも含まれます。メソッドでは、ステートは引数や、メソッドがバインドされたオブジェクト内のもの(例えば$this)、定義されたその他データやグローバルスコープで利用可能なデータになります。

副作用

コンセプトは状態(ステート)密接に関連します。副作用はメソッドや他のルーチンが自分自身のスコープがにあるものに影響する変化になります。副作用は、グローバル変数、オブジェクトのプロパティ(たとえば$this)の値の変更や、データベースやファイルシステムのデータの更新、参照で渡されたパラメータ値の変更や出力のechoのようなものが含まれます。

可変性

可変性は、変更可能はもののクオリティになります。PHPにおける可変性の基本的な具体例は、変数やオブジェクトのプロパティになります。それに対して、不変性とは変更できないもの(例えばグローバル定数やクラスレベルの定数)になります。それゆえに可変性のある状態(ステート)は上記で述べたように変更される可能性があるアプリケーションの状態(ステート)の要素であります。これは当たり前のように思えるかもしれませんが、あとで非常に重要なことだと気づくと思います。

参照透過性

可変性

class A {
    public static function foo() {
        // return some calculated value
    }
}

class B {
    public static function bar() {
        $result = A::foo();
        // perform some calculation on $result
        return $result;
    }
}
class B {
    public static function bar($dependency) {
        $result = $dependency::foo();
        // perform some calculation on $result
        return $result;
    }
}
class Dispatcher extends \lithium\core\StaticObject {

    // ...
    protected static $_classes = array(
        'router' => 'lithium\net\http\Router'
    );
    // ...
}
$router = static::$_classes['router'];
$result = $router::process($request);

この例では、B::bar()の呼び出しの全てはA::foo()の呼び出した結果になります。

Lithiumをインストールしたら次のようなfatalエラーが出ました。

Function name must be a string in .../lithium/util/collection/Filters.php on line ...

これはeAcceleratorをインストールしている為に起こるエラーです。eAcceleratorはPHP5.3ではサポートされないオプティマイザー/オペコードキャッシュになります。解決法はeAcceleratorを無効にして、サポートされているAPCやXcacheのようなアクセラレータに切り替えることです。
もし、eAcceleratorをインストールした覚えがないのでしたら、eAcceleratorをプリバンドルしているMAMPで動かしているのではないでしょうか。この場合は、Homebrewを使ってみて下さい。うまくいくと思います。

なぜlibrariesフォルダはrootディレクトリとappディレクトリの両方にあるのですか?

ライブラリが1つのアプリケーションのみで使われる場合はapp/librariesディレクトリにライブラリーを置きます。一方、1つ以上のアプリケーションでライブラリーを共用する場合、管理が簡単になるようlibrariesディレクトリは提供されています。複数のアプリケーションのapp/librariesディレクトリーにライブラリーを重複させないで済むためディスクスペースも節約できます。