include というのは、外部ファイルを読み込む演算子。
include 'ファイル名';
読み込まれるのはわかるが、 include をしたファイルは、 HTMLモードで展開される、ということを知らなかったためにハマった。
どういうことかというと、include ファイルは php スクリプトが書かれている前提ではなく、 HTML(というか、スクリプトではない単純テキスト)として読み込まれる。
つまり、
<?php // phpコード1 include 'xxxx.inc'; // phpコード2 ?>
というのは、
<?php // phpコード1 ?> <!-- xxx.inc の内容 --> <?php // phpコード2 ?>
ということ。
なので、include ファイルの内容を php スクリプトとする場合は、 include ファイルにも php の開始タグと終了タグを書く必要がある。
逆にいえば、ファイルの内容を HTML として出力したいのなら、 読み込んだ内容を echo や print などする必要はなく、include するだけでOK。
これは require(require_once)も同じ。
参考
インスタンスを生成し、それを別の変数に代入した場合の扱いが PHP4 と PHP5 で異なるらしい。
具体的には、
<?php class hoge { var $fuga = 'default'; } $src = new hoge(); $dst = $src; $dst->fuga = 'modify'; echo $src->fuga; ?>
としたとき、PHP4 では 'default' になり、PHP5 では 'modify' になる。 つまり、PHP5 では元の値が変更されるが、PHP4 では変更されない。
その理由が次のページで解説されていた。
なんかいろいろ書かれてるけど、 つまり、オブジェクトにおける代入演算子('=')の挙動は、 PHP4 はコピーの扱いで、PHP5 は参照の扱いになるってこと。
PHP4 では参照はできないのかといえば、明示的に '=&' を使えば参照の代入になる。
PHP4 で参照による代入をする場合
<?php ... $dst =& $src; ... ?>
PHP5 からは、オブジェクトの代入はデフォルトで参照になったということなので、 PHP4 のときのようにコピーをとりたい場合は、clone を使う必要がある。
PHP5 でコピーによる代入をする場合
<?php ... $dst = clone $src; ... ?>