読者です 読者をやめる 読者になる 読者になる

助太刀会計CodeReading-Menu.php

前回、助太刀会計の起動画面までは表示することができたので、
実際にコードを読んでいきたいと思います。

  1. http://localhost/sukedachikaikei/Kaikei/Menu.php

上記のソースが起動時に呼ばれるソースで、以下のソースをrequireしています。

  • ViewCBase.php
  • DtmCKigyo.php
  • DtmCKaishaJoho.php
  • DtmCNendoJoho.php
  • DtmCUserKankyo.php

ここで、迷ったのが、PHPには、includeとrequireがあり、それぞれの違いは?ということです。
PHP4徹底攻略

PHP4徹底攻略―Web DBプログラミング徹底入門 [改訂版]

PHP4徹底攻略―Web DBプログラミング徹底入門 [改訂版]

によると、

  • require

Cの#include文と同じ。ファイルの置き換えは構文解析に先立って行われる。
ループの中で、都度require文でファイルの置き換え、ということは不可。

  • include

ソース中のinclude文が処理される度に指定されたファイルの読み込みが発生する。
例えば、ループの中で毎回異なったファイルを読み込むことができる。

とあります。requireは1度だけ読み込み可、includeは複数回読み込み可能という違いなんでしょうか?
でも、require_once(),include_once()という1度しか評価をおこなわない関数も
用意されているとのこと。。。
どういうことなんだろう???

PHPマニュアルhttp://jp2.php.net/manual/ja/index.phpを参照してみると
include関数と、require関数は動作は全く同じで、エラー時の挙動が違うという記述がありました。
requireは、エラー時にfatal_errorで処理を停止するのに対して、
includeは、warningのみで、処理が続行されるとのこと。

なんだろう?この違いは???

実際に挙動を確認するため、以下のようなコードを書いてみました。

<?php
	for($i=0; $i<3; $i++) {
		require("./hoge.php");
		require_once("./hoge_once.php");
		include("./fuga.php");
		include_once("./fuga_once.php");
	}
?>

読み込んでいる各々のコード

<?php
	echo "<HTML><HEAD><BODY>";
	echo "hoge<br>";
?>
<?php
	echo "hoge_once<br>";
?>
<?php
	echo "fuga<br>";
?>
  • fuga_once.php
<?php
echo "fuga_once<br>";
echo "</BODY></HEAD></HTML>";
?>

結果は、

hoge
hoge_once
fuga
fuga_once
hoge
fuga
hoge
fuga

のようになり、hoge.php3回、hoge_once.php1回、fuga.php3回、fuga_once.php1回
読み込まれていることが確認できました。
次に、ファイルfuga.php,fuga_once.phpをリネームし、読み込めなくしてみます。
結果は、

hoge
hoge_once

Warning: main(./fuga.php) [function.main]: failed to open stream: No such file or directory in C:\xampplite\htdocs\php_test\require.php on line 6

Warning: main() [function.include]: Failed opening './fuga.php' for inclusion (include_path='.;C:\xampplite\php\pear\') in C:\xampplite\htdocs\php_test\require.php on line 6

Warning: main(./fuga_once.php) [function.main]: failed to open stream: No such file or directory in C:\xampplite\htdocs\php_test\require.php on line 7

Warning: main() [function.include]: Failed opening './fuga_once.php' for inclusion (include_path='.;C:\xampplite\php\pear\') in C:\xampplite\htdocs\php_test\require.php on line 7
hoge

Warning: main(./fuga.php) [function.main]: failed to open stream: No such file or directory in C:\xampplite\htdocs\php_test\require.php on line 6

Warning: main() [function.include]: Failed opening './fuga.php' for inclusion (include_path='.;C:\xampplite\php\pear\') in C:\xampplite\htdocs\php_test\require.php on line 6

Warning: main(./fuga_once.php) [function.main]: failed to open stream: No such file or directory in C:\xampplite\htdocs\php_test\require.php on line 7

Warning: main() [function.include]: Failed opening './fuga_once.php' for inclusion (include_path='.;C:\xampplite\php\pear\') in C:\xampplite\htdocs\php_test\require.php on line 7
hoge

Warning: main(./fuga.php) [function.main]: failed to open stream: No such file or directory in C:\xampplite\htdocs\php_test\require.php on line 6

Warning: main() [function.include]: Failed opening './fuga.php' for inclusion (include_path='.;C:\xampplite\php\pear\') in C:\xampplite\htdocs\php_test\require.php on line 6

Warning: main(./fuga_once.php) [function.main]: failed to open stream: No such file or directory in C:\xampplite\htdocs\php_test\require.php on line 7

Warning: main() [function.include]: Failed opening './fuga_once.php' for inclusion (include_path='.;C:\xampplite\php\pear\') in C:\xampplite\htdocs\php_test\require.php on line 7

のようになり、Warningは出ていますが、hoge.phphoge_once.phpの読み込み処理は続いていることが分かります。
最後に、hoge.php,hoge_once.phpをリネームし読み込めなくしてみます。
結果は、

Warning: main(./hoge.php) [function.main]: failed to open stream: No such file or directory in C:\xampplite\htdocs\php_test\require.php on line 4

Fatal error: main() [function.require]: Failed opening required './hoge.php' (include_path='.;C:\xampplite\php\pear\') in C:\xampplite\htdocs\php_test\require.php on line 4

のように、fatal errorとなり、処理がとまりました。
require,includeのそれぞれの挙動を知ることができました。

ちなみに、助太刀会計では、requireのみ使っており、require_once,include,include_onceは
使っていませんでした。エラーが起きたときにはfatal_errorですね!!!
やはりこのような微妙な挙動の違いがある関数は統一して使った方が後々メンテもしやすくなりますね。

これでやっとrequireしているのソースが読めます^^; 続く・・・