Nowdocは変数を展開してしまわないヒアドキュメント(PHP5.3以降)

ヒアドキュメントは変数を展開して評価してしまう

クラスをデータベースから自動生成するためのスクリプトを記述する際に、クラスのテンプレートになる文字列を変数に保持したかったのです。

あいにくヒアドキュメントだとダブルクオーテーション囲いと同じく、変数を展開して評価されてしまうのでアウト。

こんな感じで怒られてしまう。

function getClassTemplate()
{
return <<< DOC_END
<?php

class %{CLASS_NAME} extends Abstract
{
    protected
        $_my_class_name = __CLASS__,
        $_table_name    = '%{TABLE_NAME}',
        $_primary_key   = '%{PRIMARY_KEY}',
        $_defined_field = array(%{DEFINED_FIELD}
        ),
        $_validate_rule = array(%{VALIDATE_RULE}
        );
}
DOC_END;
}

// 変数が展開された結果、undefinedなエラー
$template = getClassTemplate();

/*
Notice: Undefined variable: _my_class_name in /script.php on line 129
Notice: Undefined variable: _table_name in /script.php on line 130
Notice: Undefined variable: _primary_key in /script.php on line 131
Notice: Undefined variable: _defined_field in /script.php on line 133
Notice: Undefined variable: _validate_rule in /script.php on line 135
*/

Nowdocなら変数を展開しないので安心

PHP5.3からはヒアドキュメントに似た記法で、終端識別子をシングルクオートで囲うことで、Nowdocを利用できます。また、変数などの展開がないためconstに指定することもできます。

function getClassTemplate()
{
return <<< 'DOC_END'
<?php

class %{CLASS_NAME} extends Abstract
{
    protected
        $_my_class_name = __CLASS__,
        $_table_name    = '%{TABLE_NAME}',
        $_primary_key   = '%{PRIMARY_KEY}',
        $_defined_field = array(%{DEFINED_FIELD}
        ),
        $_validate_rule = array(%{VALIDATE_RULE}
        );
}
DOC_END;
}

// 変数が展開されないので、良い感じに取り扱える
$template = getClassTemplate();

なるほどねー。

参考サイト