助太刀会計CodeReading-Menu.php
前回、助太刀会計の起動画面までは表示することができたので、
実際にコードを読んでいきたいと思います。
上記のソースが起動時に呼ばれるソースで、以下のソースをrequireしています。
ここで、迷ったのが、PHPには、includeとrequireがあり、それぞれの違いは?ということです。
PHP4徹底攻略
PHP4徹底攻略―Web DBプログラミング徹底入門 [改訂版]
- 作者: 堀田倫英,広川類,石井達夫
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2002/09
- メディア: 単行本
- 購入: 1人 クリック: 284回
- この商品を含むブログ (14件) を見る
- 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>"; ?>
- fuga.php
<?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.php、hoge_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しているのソースが読めます^^; 続く・・・