
PHP4でSmartyを使用した際 $smarty->assign(); が効かず、
tplファイルしか表示されないという状態が発生。
実は先月くらいから悩んでいたのですが、目をそらしてましたw
結論から言うと、参照渡し がきちんとされていなかったことが原因。
PHP5での引数受け渡しは、デフォルトで全て 参照渡し となるらしいのですが、
PHP4では 値渡し というのがデフォルトで、普通に関数へnewした$smartyなどを渡すと、
まったく違うオブジェクトとして解釈されてしまうとのこと。
私の解決方法は、
・一番初めの、関数の引数の前へ & を付ける
・全ての関数内で、クラスの引数を受け取る際 = ではなく =& を使用する
です。
・一番初めの、関数の引数の前へ & を付ける
は、例えば以下のようにPHP5でやっていたのを、
$smarty = new Smarty;
$option = array("smarty" => $smarty, "○○" => $○○);
$file = main($option);
$smarty->display($file);
以下のようにPHP4では変えました。
$smarty = new Smarty;
$option = array("smarty" => &$smarty, "○○" => $○○);
$file = main($option);
$smarty->display($file);
最初に呼び出す親的な関数の引数部分でだけ&を付ければいいようで、
以後その関数内でさらに関数を呼び出す際は、この対処は不要のようです。
・全ての関数内で、クラスの引数を受け取る際 = ではなく =& を使用する
は、例えば以下のようにPHP5でやっていたのを、
function main($option)
{
$smarty = $option['smarty'];
$○○ = $option['○○'];
}
以下のようにPHP4では変えました。
function main($option)
{
$smarty =& $option['smarty'];
$○○ = $option['○○'];
}
私みたいな最近PHPを始めた方で、
↓のサンプルコードをPHP4の環境で試した方は、
けっこうはまるんじゃないかなぁ・・。
→速効!図解プログラミングPHP+MySQLサポート
以下参考にしたサイトです。
→Smartyを使用し画面出力を行おうとしていますが実際に...
→「Yahoo!がPHPエンジニアを雇う時に聞く質問」に解答付けてみた、の4番
→PHP4 と PHP5 の違い
→コンストラクタで参照渡しをする理由
おつかれさまでした。。
関連する記事:1件
- Dreamwerver で Smarty(masha.webTechLog)
はてなブックマーク









