ヒアドキュメントは変数を展開して評価してしまう
クラスをデータベースから自動生成するためのスクリプトを記述する際に、クラスのテンプレートになる文字列を変数に保持したかったのです。
あいにくヒアドキュメントだとダブルクオーテーション囲いと同じく、変数を展開して評価されてしまうのでアウト。
こんな感じで怒られてしまう。
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();
なるほどねー。