PHP4でSmarty、tplファイルしか表示されないのは参照渡しが原因でした

php4%2Bsmarty.gif
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 の違い
コンストラクタで参照渡しをする理由

おつかれさまでした。。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください