PHPのソースコードにおいてはマルチバイト文字の途中に ASCII のエスケープ文字、角かっこ等と一致する文字列が出てくると大体処理が壊れます。例えば次です。
<?php echo "表";
UTF-8 でこの文字列を保存したファイルを web サーバから実行すると、次の様に正常に表示されますが、
SJIS で保存して実行すると、次の様にエラーが出力されます。
これは SJIS の”表”が 0x95 0x5c の byte から構成され 0x5c が単体では”\”を表していることが原因です。このため SJIS のソースコードでは二つ目のダブルクォーテーションがエスケープされることになり、文法エラーとなりました。この文字コードによる意図しない文字が紛れる問題は PHP に限らずしばしば起こります(MySQL など)。
他ファイルを読み込む時に問題が起きることもあります。例えば次です。
<?php /** SJIS で書かれたファイル sjis_var.php */ $ほげ = 'hoge' <?php /** UTF-8 で書かれたファイル utf8.php */ // SJIS で書かれたソースコードを読み込み require __DIR__. '/sjis_var.php'; // SJIS の"ほげ"と UTF-8 の"ほげ"は違う byte なので $ほげ は未定義変数として扱われる var_dump([ 'isset' => isset($ほげ), // false 'val' => $ほげ ?? null,// NULL 'name' => 'ほげ',// "ほげ" ]); // UTF-8 の"ほげ"を SJIS の"ほげ"に変換 $varName = mb_convert_encoding('ほげ', 'SJIS-win', 'UTF-8'); // SJIS の"ほげ"の byte をキーにして↑同様に読むと定義された変数であることがわかる var_dump([ 'isset' => isset($$varName), // true 'val' => $$varName ?? null, // hoge 'name' => $varName, // "�ق�" ]);
こんな感じで何かと事故を起こしやすいのでソースコードは UTF-8 に統一しておくのが無難です。