PHPの閉じタグはもう書かない!

久々にそんな風に思わされる出来事があったので、色んな所でかかれていますが私も書いておく。
もう、不要な閉じタグは片っ端から消していくぞ!!

そもそも閉じタグとは

PHPの閉じタグとは

<?php
phpinfo();
?>←これです
PHP初心者は必ず最後にはこれを書きましょうと習いますね。

なぜ書いてはいけないのか?

例えば、画面に直接出力させるような

<html>
〜略〜
<h1>タイトルです</h1>
<?php
echo 'hogehoge';
?>
<div>
〜略〜
</html>
こういう時の閉じタグは書かなければダメです。
PHPの終了が分からなくなってしまうので。
でも、PHPのみのソースであれば書かなくてもOKです。

<?php
public class hogeObject(){
〜略〜
}
?>←これはいらない
最近はフレームワークを使う事が多いので、画面表示と動作のソースファイルは分かれているのがほとんどではないでしょうか。
Zendでもコーディング規約で「閉じタグはつけないようにしましょう」となっていますね。
理由は
ファイルの最後にある空白文字が出力に影響するのを防ぐ
ため。
閉じタグ後に空白文字や改行があると出力されてしまうんですね。(改行の場合は2行以上あると出力です!)

空白文字や改行が与える影響

画面の表示がちょっとおかしくなる…ということもあると思いますが、一番の影響はリダイレクト!!
リダイレクトに使うheader()は、先に出力があると動きません。

もうお分かりかと思いますが、この閉じタグ後の改行のせいでリダイレクトせず、システムが動かないということがありました。
リダイレクトできないのだから先に何か出力があるのだろうということは容易に想像ができたのですが、
どこを探しても出力してるファイルが無い!!
出力に関係しているファイルは閉じタグ後に余計なものは書かれていないのに…なぜ!?

まさかお前のせいだとは…

物によりますがフレームワークでは色んなファイルを読み込ませていますね。
私の作業していたシステムでは、開発用のローカルDBの設定ファイルを別に作って読み込ませていました。
貰ったファイルはテスト用サーバーのものだったので、ローカルDBの設定ファイルは読み込めないように名称が変えてあったんですね。
それで設定ファイルの名前を元に戻してシステムに読み込ませるようにして作業をしていたのですが、
このようなファイルがあることをすっかり忘れている私…
それまでリダイレクトが出来なくても開発には影響がなかったので無視していたのですが、さすがに無視出来ない作業が発生しまして。
どうにかして動かそうと、フレームワークのコアの部分まで動きを追って見つけましたよ!設定ファイル後の余計な改行を!!

このヤロウ…と一瞬作った人を恨みましたが、きちんと確認して閉じタグを消さなかった私も悪いのです…。
なので、今後の人のためにも不要な改行はなくしていこうと決意した瞬間でした。

立教生Twitter炎上のその後から

久々の記事であることを華麗にスルーしてブログを書いてみるなどw


テレビを見てないせいか、最近メディアリテラシーを考えさせるようなニュースにばかり目が行ってしまっています。今回のニュースはマスコミではなく、個人が発信した発言から大炎上したお話。何となく追いかけていて、今日決着がついた(?)ようなので。


「レイプ容認」発言で炎上立教大生 内定先大手百貨店に「電突」騒ぎ (1/2) : J-CASTニュース


今年、1月の20日ぐらいに発生した話ですね。
男子大学生がレイプ事件に対して「レイプされるのは女が悪い」的な発言をして、Twitter炎上。その後、ネット上では内定先に問い合わせとか、内定取り消しの電話をする人が出てきて…
そして今日、伊勢丹の内定がなくなったらしい…という噂が。
本当かどうか分からないので明言は避けます。が、個人的な意見としては、当然の結果でほっとしてると言ったところです。(容認発言の返信への対応。それ以前のツイート内容など、結構宜しくない感じだったので…)


この件で、「実名を出してつぶやいちゃだめだろ」ってことが指摘されてますが、それより「発言は責任を持って、慎重に言葉を選べ」ってことの方が大事な気がします。彼だって子供じゃないんだし。


多分、個人名を出すぐらいだったらこんなに炎上しなかったかもしれません。実際彼も、レイプは悪い事だと後のツイートで弁明してます。
が、彼は「立教大生&有名百貨店内定者」という看板を背負ってツイートしてしまったわけです。これはもはや、組織の一人(&となる予定)の責任が伴ってきます。
彼はそこに気づけなかったんじゃないかなぁ。


(私なんかは絶対仕事内容&お客様のことはつぶやきません。それで情報流出とか責任とれないもの…!)


日本でもそろそろ、ネットの発言の重さが「知らなかった」じゃすまされない。というか、すませちゃいけない時期なんじゃないでしょうか。

【PHP】オブジェクトをシリアル化するときの注意点

今回のネタは、時間がないので備忘録より抜粋。
書いたときから時間が経ってるので、自分でもも忘れてました><

シリアル化の基本

シリアル化とは配列などのデータ型を再現可能な、
受け渡ししやすい形に変換すること。
主にセッションでの受け渡しや、DB保存して行うことが多いです。
で、PHPでのシリアル化の方法は

PHP4以降からは、オブジェクトもシリアライズ可能になりました。
シリアル化のさらに詳しい説明はこちら
PHPのTIPS :: シリアル化(ささら庵:プログラム:PHP)

オブジェクトはシリアル化だけで終わっちゃいけない

一見簡単そうなオブジェクトのシリアル化ですが、ここで落とし穴が。
こっちのマニュアルでは書いてなくて、こっちのマニュアルには書いてあるのですが、
privateとprotectedメンバの前後にはNULLバイトが入ってくるとか…!
これをそのままDBに保存すると…文字化けします…orz
私はここで小一時間詰まりました(;_;)
ちゃんと書いておいてくれよう!!
どんな状況になってるのかは以下を参照
2008/11/03 PHP でオブジェクトのシリアライズ (HiNa) - fetus Diary - fetus



じゃあどうするのかというと、シリアライズした後「addslashes()」で文字列をクオート、非シリアライズする前に「stripcslashes()」でクオートを取り除いておけばOK。
…と思ったけど、addslashes()には脆弱性があるそうな。
addslashes() による SQL 文字列のエスケープ回避問題(t_komuraの日記)

詳しいことは今度調べますが、Shift_JIS以外の文字コードを使用して、mysql_real_escape_string()かPrepared Statementsでクエリを発行したら良さそう。



て。ここまでしっかりエスケープ処理してたら、普通、NULLバイトのバグには遭遇しませんがな!!ヽ( `д´)ノ
よろしければ、一知識として覚えておいてくださいまし…

【PHP】trim()で半角&全角空白を取り除く場合

文字列前後の空白削除はtrim()!…ですが…

この便利なtrim()なんですが、
デフォルトでは全角空白は取り除いてくれないんですよね(; ;)
そこで、


$hoge = trim($hoge," ");
$hoge = trim($hoge," ");
で良いのかなと思っていたら…
だめみたい><

PHPのtrimって、全角の空白(スペース)は削除してくれないのですか?(メモ帳@プログラマー初級)

よく考えると、半角と全角混合してるスペースだったら、全部取り去る前に処理終了しますがな!ってお話。

trim()、もちっとスマートに書けるみたい

上の方のやり方ではpreg_replase()を使って置換してますが
どうやら、スピードは遅いらしい…

PHP でtrim+全角スペースを取り除く時のベンチマークを取って見た(Affirmative Way)

trim()強し!
ていうか、全角空白を半角に直しちゃえば、trimで行けちゃうよね。気づかなかった…

trim(mb_convert_kana( $hoge, "s"));

こっちのほうが分かりやすい!


こんな感じの備忘録を週1ペースで書いていきたいと思います。
初級者向けの内容ですが、何か発見があれば幸いです(^ ^)

それにしても、久々にタグ書いてる私、イキイキしてる!(笑)

始めてみたよ!

プログラミングお勉強メモ用にブログ始めました。


単純に前のブログのジャンルが完全に偏ってしまったから、
続けにくかっただけなんですけどね!
例のごとく続かないかもしれませんが、
ちょこちょこ更新できたらいいなと思っております。


もちろん、プログラミング以外の事も書くけどね!
割合が逆転しないようには頑張る…つもりです><