LoginSignup
1
0

More than 5 years have passed since last update.

ループ内のrequire_once

Last updated at Posted at 2015-06-28

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"が空の配列になるためにバグが発生していたようです。

自分の場合は、他の箇所でバグが出てると警告が出て、たどり着いたのがここでした。コード規模がこの程度だとバグが出てこなくなって不思議です。


参考文献
http://stackoverflow.com/questions/11468579/calling-require-once-inside-foreach-loop-code-is-not-available-on-each-iterat

1
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0