foreach内でrequire_onceを使おうとしたところ、バグが出てしまたのでメモ
test1.php
<?php
$text1 = array('foo', 'piyo');
foreach($text1 as $value1) {
require_once('test2.php');
foreach($text2 as $value2) {
echo $value1 . ' ' . $value2 . "\n";
}
}
?>
test2.php
<?php
$text2 = array('fuga', 'hogera', 'hogehoge');
?>
こちらは簡略化した例で、このコードではバグは出ません。しかし、コード規模が大きくなると(?)バグが出ることがあるようです。解決策としては2つあります。
1.require を使う
require_once('test2.php')
を require('test2.php')
とする
2.require_onceの呼び出し箇所を変える
自分と同じようなコードパターンの場合
test1.php
<?php
$text1 = array('foo', 'piyo');
require_once('test2.php');
foreach($text1 as $value1) {
foreach($text2 as $value2) {
echo $value1 . ' ' . $value2 . "\n";
}
}
?>
とすれば、ファイルにアクセスする回数も減ります。
どうやらrequire_onceでは既に一度ファイルが読まれて変数が読み込まれますが、2回目以降はrequire_onceの仕様上読み込まれなくなり、"$text2"が空の配列になるためにバグが発生していたようです。
自分の場合は、他の箇所でバグが出てると警告が出て、たどり着いたのがここでした。コード規模がこの程度だとバグが出てこなくなって不思議です。