アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になっております。
環境/PHP5.2.5、SQLite3

内容は単純です。

A.php から、B.php をincludeする場合の、
「B.phpのコーディングで気をつけるべき点」について、教えて下さい。

A.phpの中では、
例えば、

header('content-type:text/html; charset=utf-8');
error_reporting(E_ALL);

のようなことが書かれているとします。
その上で、

B.phpについても、同様に、上記2行を記載するのは、
スマートではないですよね?

つまり、
結局includeされるのですから、
A.phpでしていることを、B.phpでもするのでは、
同じことを2度していることになり、冗長なのでは?
という意味です。

意味のある繰り返しならば良いですが、この場合には、
意味があるとは思えませんので、
スマートではない、と私は思っているわけです。

では、B.php では、上記のような記述は必要ないのか、
と考えると、自信を持って、イエスと言えない自分がいます。
(B.phpでも、文字コードを「UTF-8」にしたり、
エラー出力を「E_ALL」にしたかったりする、という前提でのお話です。)

ちなみに、
B.php の中で、PHPコーディングをする際に、
開始タグ<?php、終了タグ?> はそれぞれ必要なのでしょうか?
必要だろう、という認識のもと、現在コーディングしていますが、
無くても良かったりするのでしょうか。笑
(初歩的な質問で、すみません。)

どなたか、このinclude周りのタシナミについて、
アドバイスをお願い致します。

A 回答 (2件)

<?php ?>の「?>」のほうは記述しなくても良いようです。


?>の後ろに、改行でもあったりすると、ソレも文字の出力とされてしまうため、その後にheader関数でヘッダを出力、session_startしようとするとコケる、ということもあるので、その対策だそうです。(私自身はいつも閉じてますが。)
開始タグ「<?php」に関しては必須です。スクリプトの開始には必ずつけてください。

include、include_once、require、require_once、と別ファイルを読み出す制御構造はあるわけですが、xxxx_onceのほうは、同一ファイルを2度読まないという特徴があります。
基本的に2度読むことなんてほとんど無いと思いますので、xxxx_onceのほうを使った方が良いと思います。
また、includeとrequireの違いですが、
http://php.benscom.com/manual/ja/function.includ …
この通りで、requireの場合、該当するファイルが読み込めない(ファイルが存在しないなど)があった場合、エラーでスクリプトが終了します。
includeの場合は、warningが出るものの、その後のスクリプトは実行します。
該当ファイルが読み込めなくても実行したいことなんてほとんどないので、requireを使った方が良いです。
上記より、別ファイルの読み込みには、require_onceを使うということになります。

次に、別のファイルを読み込む件について、作法というか考え方に関しては、それぞれある程度意味のまとまりを作ってやるというところになると思います。基本、クラスの考え方と一緒で、
一つのファイル内に記載されている内容はある一定の意味の塊としてやらないと、どこで何やったかわからなくなると思います。
例えば、設定値は全てconfig.phpに記述して、プログラムの動作に必ず必要な処理は、init.phpに書いて、汎用的に使うユーザ関数群は、functions.phpに書いて、とか。
そうすれば、コンテンツを作る際に、
----contents.php------
<?php
require_once 'config.php'; //これはinit.php内に記述しても良い
require_once 'init.php';
require_once 'functions.php'; //これもinit.phpに記述してやっても良い

//コンテンツ用のロジック

?>
としてやって、コンテンツごとのロジックだけを一つのファイルに記述してやればよいということになります。
一つ一つのファイルにある程度の意味わけをしてやれば
>A.phpでしていることを、B.phpでもするのでは、
>同じことを2度していることになり、冗長なのでは?
このような悩みも起きないと思います。

この回答への補足

いつもながら、詳しく説明頂きありがとうございます。
今回もレスポンスしたい内容が結構ありますので、よろしくお願い致します。

>その対策だそうです。

終了タグを省略するのは、そういった意味があったのですね。
どこかの会社?の社内コーディング規約(ネット上に公開されていた)に、

終了タグ「?>」は省略すること。

と明記されており、その理由を私は単に、
「多少、手間は掛からなくなるよね。笑」
くらいに思って読んでいました。

>(私自身はいつも閉じてますが。)

私も閉じてますね。
今後、余計なスペースを入れないよう注意することに致します。

>include、include_once、require、require_once

この辺りの知識は多少ありまして、
hogehogeさんのお勧めにもありましたが、
私も普段、require_onceを使うよう心掛けています。

requireを意識して使う場合は、while等の繰り返し文の中で使う場合くらいです。
これは、繰り返しの中で毎回、外部ファイルを読み込む必要がある場合に、
require_onceではダメだったので、
requireをその時は使った、というもので、
私にとっては今のところ、レアケースな処理です。

includeは基本に使っていませんね。

質問タイトルで、includeとして書いていましたのに、
ごめんなさい。笑
requireはincludeに比べて、存在感がないな
と思っていましたので(偏見です。爆)、
知名度のあるincludeを使ってタイトルを書かせて頂きました。

//-----
上記より、別ファイルの読み込みには、require_onceを使うということになります。
//-----

ホゲホゲさんに、そうおっしゃって頂けると、大変心強いです!

そして、

>該当ファイルが読み込めなくても実行したいことなんてほとんどない

私も、そう思いながらincludeの仕様を読んでいたことがあります。

//-----
一つのファイル内に記載されている内容はある一定の意味の塊としてやらないと、どこで何やったかわからなくなると思います。
//-----

そうですよね。
塊を作って読み込んで、なんたら~ という作業には、
「requireでソースをそのまま読み込む」タイプ
「functionを読み込み、それをもとに、functionを展開」タイプ
「classを読み込み、それをもとに、classを展開」タイプ

の3タイプあると思っていて、
それらをどう使い分けたら良いか、
現在、模索中です。
これを整理できるようになれば、
PHP5級くらいには、なれますでしょうか。笑

>----contents.php------

設定ファイルの読み込みでも、一工夫してやろうと、
今、企んでいるところです。

無駄なファイルは読み込まないように、
そして、その振り分けをシステマティックに、
したいと考えています。

//------
>同じことを2度していることになり、冗長なのでは?
このような悩みも起きないと思います。
//------

ちょっと複雑なケースになりますが、
B.phpを読み込みファイルとしてだけでなく、
それ自体も閲覧させるような設計でサイトを作ったことがありまして、
その場合、B.phpが独立して存在できるよう、
スクリプト先頭に、
header(~~なんたら);
error~~なんたら;
と、記述していたことがあります。
(B.phpの例として…データ一覧表示スクリプト等。)

で、もちろん、B.phpは読み込みファイルとしても機能させていたわけですから、
「2重の記述」になる場合が生じたわけです。

そういったケースでは、ただただ、
2重であることを許容すれば良いだけなんでしょうかね。

冗長ではあっても、エラーにはならないでしょうから。

そもそも、読み込み&自立 の二面性のあるファイルを使うことをまず見直すべきなのでしょうかね。
(この辺りの判断は、経験を積むことで分かるようになってくる気がします。)

補足日時:2009/08/27 03:48
    • good
    • 0
この回答へのお礼

今回もどうもありがとうございました。
とても助かりました^^

お礼日時:2009/09/05 03:32

冗長であることについては



headerで同じ要素(この場合はcontent-type)を2回以上おくった
場合は、後に指定したもののみ有効になるようです。
サーバー側で解釈してくれるみたいなので、ブラウザが誤認識
することもないでしょうし、普通に運用なさっているなら2回指定
もおそらくだいじょうぶだと思います。

error_reporting()については、その指定後に反映される範囲が
異なります。

<?php
error_reporting(0);
print $a; //(1)
error_reporting(-1);
print $a; //(2)
?>

ここでは(1)はエラーになりませんが、(2)はエラーになります。
したがって影響範囲が異なることを前提に、2回以上指定する
意味があると思います。(同じエラーレベルを指定するなら無駄ですが)
    • good
    • 0
この回答へのお礼

yamabe.jpさん、いつもありがとうございます。
確認のため、書かせて頂きます。

【A.php】
<?php
//=============A.php独自処理エリア開始========
header(~設定A~);
error_reporting(1);

// ~ A.php独自の処理 ~

//=============A.php独自処理エリア終了========

//=============B.phpインクルード===============
include 'B.php';

// ~ B.phpの処理 ~

//=============B.php終了=======================
?>


【B.php】
<?php
header(~設定B~);
error_reporting(0);

// ~ B.phpの処理 ~

?>

//-------------------------
上記の場合、

A.php独自処理エリアでは、
header(~設定B~); //後に送った方(B.phpのヘッダー)が優先される
error_reporting(1); //設定以降のエリアに適用されるようなので。

B.php独自処理エリアでは、
header(~設定B~);  //同上
error_reporting(0); //設定以降のエリアに適用されるようなので。

こんな感じで、
スクリプトは処理されるのでしょうかね。

お礼日時:2009/08/27 15:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!