G-chan Square

じーちゃん/へたっぴの綴る、日々のつれづれとか。
twitterのまとめとゲームネタが中心。2015年からロードバイク/ミニベロ始めました。

PHPで仕事をするときの注意

PHPネタです。

  • コーディング規約を守る。組織にコーディング規約がないなら、Zend Framework PHP標準コーディング規約 [zend.com]を使う。オレ流コーディングスタイルは禁止。
  • 内部コードにはEUC-JPかUTF-8を使う。入出力もできるだけShift JISを避ける。Shift JISを使う場合には2byte目に0x5Cを含む文字の動作を忘れずに確認する。
  • 開発環境の警告レベルをE_STRICTにする。本番環境ではdisplay_errorsをオフにする。
  • register_globals、magic_quotesはオフにする。
  • type hintingを積極的に使う。
  • スコープの長い配列をクラスでラップする。
  • プレゼンテーションとロジックを分割すること。プレゼンテーションには変数または関数の出力とループ以外のロジックを残さないこと。ロジックの中で直接出力をしないこと。ロジックはSimpleTestを使って単体テストすること。
  • SQL文に変数を埋め込むときにはプレースホルダを使う(PDOのprepareとbindParams)。
  • リクエストから取得したパラメータを出力するときはhtmlspecialcharsを使う。
  • 関数が長くなったら分割する(composite methodパターンを使おう)。
  • グローバル変数を使うのは避ける。
  • 変数を定数として使わない。定数はdefineで定義するか、const宣言する。
  • 常に最新バージョンでテストできる環境を作り、サービスイン後もバージョンアップに対応するための予算をとっておく(サービスイン後にお金をかけたくないなら、PHPは避けるべき)。
  • 継承を使うなら、クラス図くらいは書いておく(単にコードを再利用したいだけなら、移譲を検討すること)。
  • 各URLにおけるパラメータとその閾値を文書化すること。パラメータの閾値の境界線についてソースレビューし、テストすること。
  • 既存のフレームワークを学習することに投資すること(学習コストを嫌って自己流のフレームワークを作ることは、バグを作りこむことになるのでかえってコスト高になる)。
  • PHPしか使えない作業者の成果物はこまめにレビューすること。
  • 設計を重視すること。
  • コピー&ペーストプログラミングの匂いを発見したら、そのコードを書いた人にプログラミングの基礎を教えること。
  • リファクタリングの時間をスケジュールに入れること。
  • require/includeを条件文や関数宣言の中に記述しないこと。

PHPで仕事をするときの注意より引用


激しく同意なところも、まぁまぁ同意なところも、それができれば理想型だけど現実はそうはいかないことが多いよね……などと諸処思うところありますが、参考になるので転載。

強いて言うならば、各注意に対して「なぜ、そうなのか?」という理由も書いてあると良かったかな。(書いてあるのもあるけど)
「require/includeを条件文や関数宣言の中に記述しないこと」とか理由がないと「え?なんで?」と思う人もいるだろうし。<でも実際やると、いろいろハマりポイントになりやすいんだよねw
あと、WEBページのviewで条件分岐してテンプレートモジュール読み込むときとかは、条件文の中にincludeあっても問題ないと思う。ケースバイケースなんだろうね。

ちなみに、じーちゃん「プレースホルダ」って知りませんでした。<これが一番ためになったかな

コメント(4)

inujini 返信

あああ(;´Д`)おれだめだ。グローバル変数大好き。
あとhtmlspecialchars使わない。自作のコピペする汎用関数通してる。
作る物にあわせてエスケープする文字とか変更。

あとぶちゃけS-JISとか入出力で内部はUTF-8とか自力でやるのは滅多に無いのでわからない(;´Д`)みんなmbstring.http_outputに頼ってました

つーかsjis滅びるのまだぁ?そろそろdocomoもutf-8でいいんじゃねとか思いますね。

じーちゃん 返信

おお、悩める子羊よ、祈りなさい<なんちってww

htmlspecialcharsはね、便利なんで使った方がいいね。
ただ、htmlspecialcharsにも罠(?)があって、htmlspecialcharsの第二引数に
"ENT_QUOTES"を指定してやらないと、シングルクォートを変換しない。
デフォルトでは、ダブルクォートは変換するけどシングルクォートは変換しない仕様となってる。

で、基本、シングルクォートもWEB表記するときには ''' で問題ないので、
第二引数には"ENT_QUOTES"を付ける癖を付けておくといい。
何がいいかというと、これが、そのままSQLinjection対策にもなるんだよね。

ただ、じーちゃんはいままで知らなかったんだけど「プレースホルダ」なんてものがあるのね。
これがしっかりしていれば、自分でサニタイズとかしなくても安全性の高いSQL文ができあがるのかな。
↑まだ使ったことないからわからないけど


「グローバル変数を使うべきではない」ってのはPHPに限らずすべての言語で共通かな。
じーちゃんやinujiniくんが若かりし頃と違って、いまはCPUとメモリの性能が向上しまくってるから、
「リソース節約」よりも「保守性、可読性重視」が世の中の風潮。
グローバル変数を使うくらいなら、そのグローバル変数をいじったりアクセスするため専用の関数を作りなさい、
というのが今の世の中ですw
Cの共用体とかビットフィールドとか、ほとんど過去の遺物なんじゃないかな。
特に、WEB屋にはほぼ無用の世界だねw


「あとぶちゃけS-JISとか入出力で内部はUTF-8とか自力でやるのは~」は
基本それでいいと思うけど、完全自作のアプリを書くときには、
そのソースファイルの文字コードにSJISを選ぶのは愚の骨頂だね。
今なら、ぜひUTF8を選ぶべき。最低でもEUC。
SJISだと、「表示」の「表」の字の2バイト目が半角の¥なので、続く文字がエスケープされちゃいます!ww
とか自らハマりに行くようなものだねw

sjisホント滅んでほしいね……。WEBからは滅びいく方向にあるぽいけど……そっか携帯か……。
「あなたが10万円出してくれれば、確実に世の中からsjisが滅びます」というならば、喜んで10万提供するねw
ドラゴンボール集めてシェンロンにお願いしようかなw

inujini 返信

プレースホルダはあれだっけ?SQL構文をテンプレートみたいにして使うやつ。おれも使ったこと無いなぁ。頻繁に使うパターンはクラスにしてブチ込んじゃいますね。

エスケープはhtmlspecialchars使ってみるようにしようかな。
htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
とした上で、<>、,、'とかだけ別でエスケープすればいいのか。

じーちゃん 返信

http://jp.php.net/manual/ja/function.htmlspecialchars.php
によると、「>」「<」「&」「"」「'」の5文字はエスケープしてくれるから、
その他の文字をエスケープしたい場合には、自前でやるしかないね。
個人的には、この5文字に加えて「\」(バックスラッシュ)もエスケープしてくれるとうれしかったんだけどなぁw

コメントする