パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

PHPは駄目な言語なのか?」記事へのコメント

  • by oldwave (20436) on 2008年02月03日 12時07分 (#1290697) ホームページ 日記

    趣味でやっている人のことは、まあ、いいとして(踏み台にされる可能性はあるけど)、仕事で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に限らない話も多いけどね。PHPを採用するときって「期間」「人材」が理由になることが多いけれど、それらの問題を解決できるほどPHPは素晴らしいものではない、ということは知っておいてもいいんじゃないかと。百戦錬磨の腕利きたちがいるとき、期間を短くするためにPHPを使うのはいいでしょう。人材不足でPHPができる人しか揃わないときは、PHPしかないですよね。でもね、両方の場合はプロジェクトを断念する方が間違いないです。未熟なプログラマーでも素早くWebアプリケーションを十分な品質で作れる方法なんかないですから。

    # まあ、それはそれとしても、PHPの言語仕様がいろいろトホホなのは確かだけど。

    • by Anonymous Coward on 2008年02月03日 14時09分 (#1290751)
      親コメント
    • > ・スコープの長い配列をクラスでラップする。

      関数とのデータの受け渡しに連想配列なんかを使われると地獄。
      関数に引き渡すデータを構築するために、実際にその配列が使われている箇所のコードを
      精読しないといけなかったり、逆に関数から返される配列の中身を調べるのに苦労したり。
      その上、実際にその連想配列を使ったり組み立てたりしているのは、深い深いところにあ
      るルーチンだったりして、結局その動作解析に時間を使ってしまったりして。

      ドキュメント書けよ...っていうのと同根なんだけど、ドキュメントがあっても複雑さは
      消えないんですよね。
      クラスだったら、その定義を見ればデータ構造は一目瞭然(の場合が多い)って主張はし
      ているんですが、楽なんですよね連想配列は。
      いきなり(定義なしに)複雑なデータ構造を組み立てられるから。

      # 個人的には、ファイルをまたぐ場合には連想配列は使わないようにしています。
      親コメント
    • > # リクエストから取得したパラメータを出力するときはhtmlspecialcharsを使う。
      ×。
      これは、「リクエストから取得した」と限定をつけて覚えてはいけない。(少数の例外を除き)いかなる場所から取得したデータ(変数)でも、が正しい。たとえ明らかにエスケープが要らない場合でも、コーディング規約とするなら、「必ずエスケープする」、とするべき。必要な場所で忘れないために。

      あと、クエリ文字列の場合は urlencode であることも忘れないように。
      親コメント
    • by Anonymous Coward
      PHPはblogの手直ししたときに触ったくらいの人間です。
      でもC/C++, C#, Java, Perl, Rubyあたりで仕事してる人間です。
      が、なんっすかこれ!PHPめっちゃむずかしいじゃないですか。
      特に
      >Shift JISを使う場合には2byte目に0x5Cを含む文字の動作を忘れずに確認する。
      はすごいね。。。

      # まぁどの言語でも日本語の取扱いは苦労するもんですけど、、、
      • by Anonymous Coward
        PHPでは0x5Cの扱いに困ったことはないんですが(mbstringがあるから)、Perlではどうにもならずに困ってます・・・
    • by Anonymous Coward
      おー、いいまとめだと思います。で、 1 点だけ気になったんですが、

      > require/includeを条件文や関数宣言の中に記述しないこと。

      コレは時と場合によるんじゃないかなぁ、と。
      例えばキャッシュを使う場合は、キャッシュミスの時だけ require する方が効果的で、
      それは PEAR の Cache_Lite のドキュメント [php.net]でも推奨されています。
      #関係ないんですが、この辺の日本語訳がなんかとても怪しい...
    • by Anonymous Coward
      >組織にコーディング規約がないなら、Zend Framework PHP標準コーディング規約 [zend.com]を使う。オレ流コーディングスタイルは禁止。

      ああ。あるある。
      「組織が」オレ流コーディングを作っちゃうってのが。

      その言語でのベストプラクティスや逆にアンチパターンを
      ろくに知りもしないやつに、規約作らせたりするんだよね。

      ヘタなコーディング規約休むに似たり。
      仰せの通り既存の良いやつを探して使いまわすのが吉。

      …でも詳しくない奴は、そういうものが何処に有るのか、どれが良いのか、時としてそれどころか存在に思い至ることすら、困難だったりする。

      >関数が長くなったら分割する(composi
    • comment3, saw palmetto effect on bodybuilding [afonsodaley.com], iiacba, top 25 hip hop songs [fortunystudio.com], %-]]], new smyrna beach chrysler dealer [tfwstl.com], %-]], simplicity coronet deck belt installation [depierrolawns.com], 665253,
    • comment4, sax comm [afonsodaley.com], =-(((, simpson's hit and run, cheats, walkthroughs [depierrolawns.com], >:-DDD, hiring parks recreation director [edgelaneschool.com], scf, tonino's cutina italiano, saugus [fortunystudio.com], =-OO,
    • comment2, saver health [afonsodaley.com], wucgd, toe implant [fortunystudio.com], amu, new york city suberbs [tfwstl.com], cepdf, tommy lundegaard [fortunystudio.com], lluddl,

最初のバージョンは常に打ち捨てられる。

処理中...