SSブログ

PHPはじめました::PHPってチャラい [コンピュータ]

 会社でちょっとしたWebアプリを作りたくて、Amazon でWebプログラミングの解説書と、PHP入門書を3冊ほどお買い上げ。プログラミングって、作りながら覚えていくのも良いけど、ある程度の「お作法」や「セオリー」を学んでからのほうが、後で一から作り直すはめになったり、変な癖を覚えてしまう心配がなくて良い。

「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか

「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか

  • 作者: 小森 裕介
  • 出版社/メーカー: 技術評論社
  • 発売日: 2010/04/10
  • メディア: 大型本

 初日はまず、そもそも今日のWebアプリの開発に関するいろはを知るために上の本を読む。Webの歴史から始まり、OS上で動くネイティブアプリとWebアプリ(オンラインアプリ)との違いの説明や、必要となる技術・開発ポイント(Cookie、セッション管理、セキュリティ対策等) 、効率的な開発手法(サーブレット/JSPの使い分け、フレームワーク)など、基本的なことが書かれています。タイトルが的を射てない感じがするけど、Webアプリの“概要”を学べる良書だと思う。

よくわかるPHPの教科書

よくわかるPHPの教科書

  • 作者: たにぐち まこと
  • 出版社/メーカー: 毎日コミュニケーションズ
  • 発売日: 2010/09/14
  • メディア: 単行本(ソフトカバー)

 次に読んだのこれ。タイトルそのまんまだ。本の構成や、レイアウト、説明文・図、すべてにおいて簡潔でわかりやすく、ド初心者でもスムーズにPHPを理解できた。その上、環境の構築方法や、最低限のセキュリティ対策などもきちんとレクチャーしており、これ一冊でごく簡単なWebアプリを作るまで持って行ける。これもなかなかの良書だった。

PHP 逆引きレシピ (PROGRAMMER’S RECiPE)

PHP 逆引きレシピ (PROGRAMMER’S RECiPE)

  • 作者: 鈴木 憲治
  • 出版社/メーカー: 翔泳社
  • 発売日: 2009/06/30
  • メディア: 単行本(ソフトカバー)

 最後に読んだのがこれ。膨大な目次と索引により「こんな事したいんだけど、どう書けばいいの?」って時に便利そうだけど、あらかじめ斜め読みすることで「そういやこの処理、あの本で解説されてたなあ」となり、活用できた。ただサンプルコードの説明がほとんどなく、そのコードが何をしているのか分からず、初心者にはけっこう厳しい。あと身も蓋もない話だけど、こういうのってググるのが一番早いのよね…。

 2日目。実際にアプリの開発をスタート。作るアプリは、指定されたルーターに Telnet し、L2TPトンネルの接続情報を収集し、一覧表示するというのもの。ログを残したいし、トンネル数が1台あたり数千セッションになる事もあるので、情報はすべて MySQL にまかせることにしました。(自前で管理すると、ログのローテーションとか、ロック処理とかめちゃくちゃめんどくさいので)

 まずはルーターに Telnet して情報を取得し、それを解析・処理して MySQL に投げるデータ取得部の開発。Telnet は socket とか難しそうだったので、shell にまかせることに。あとは、ただのテキスト解析だけなので while 文で一行ずつ処理していくだけ。半日ほどで完成。

 続いて3日目はデータ表示部を開発。MySQL からデータをひっぱてきて整形して表示するだけ。通信量・通信時間など、いくつかの表示モードを用意するも、やってることは 二重for文。これまた半日で完成。この表示部を作ってて、改めて CSS のありがたみを知った。コードとデザインを分けて作れるというのは非常に大きい。

 さて、わずか3日間でWebアプリを作ったことに周囲から驚かれたけど、まさに PHP + MySQL だからこそ出来る業だろう。Perl や Java ではそうはいかない。さて、たった3日間やっただけの初心者が語るべき事ではありませんが、つくづく「PHPってゆるいプログラム言語だなぁ…」と痛感しました。

1. 型の扱いがゆるい

 PHPはなんと型宣言ができない。変数に値が初めて入力されたときに、その型が決定される。 print("わたしは $age 歳です"); とすると、整数型の $age は勝手に文字列に変換される。だからPHPは便利!!ってのはわかるんだけど、いろいろとヤバい。

<?php
$a = "3兄弟";
$b = 10;

print( $a + $b );
?>

例えばこんなコード。整数型の変数 と 文字型の変数を 足し算するという意味不明な処理をさせるプログラムです。まともなプログラミング言語だったら、コンパイル時に「なにしとんねん」とエラーが出そうなものですが、PHPでは何食わぬ顔で実行し、しかもその答えをなんと「13」と表示されます。

内部では、加算時に $a が整数に自動変換され、このとき"3"の文字が入っているために、$a = "3兄弟" → 3 となって、3 + 10 = 13 ってわけ。なんかすげー気持ちが悪い。

あと、未定義の変数も平気で処理しちゃうので、変数名をちょっと打ち間違えてプログラムが意図しない動作をしても、何が原因だかさっぱりわからない。

2. false パラダイス

 PHPは、空の変数は偽、NULLも偽、0も偽。みーんな偽。

<?php
$str1 = "Hello World";
$str2 = "Good bye";
$keyword = "Hello";

$result = mb_strpos( $str1 , $keyword );
// $str1 に $keyword が含まれていたら、その場所(何文字目か)を返し、
// 含まれていなかったら false を返す
if( $result >= 0 ){
print("$str1 の $result 文字目にヒットしました\n");
} else {
print("$str1 に $keyword は含まれていません\n");
}

$result = mb_strpos( $str2 , $keyword );
if( $result >= 0 ){
print("$str2 の $result 文字目にヒットしました\n");
} else {
print("$str2 に $keyword は含まれていません\n");
}
?>

このコードの結果は

Hello World の 0 文字目にヒットしました
Good bye の 文字目にヒットしました

となります。1つ目の文字列は、先頭(0文字目)に "Hello" が含まれているので 0 を返します。2つめの文字は、"Hello"が含まれていないので、 false を返します。でも PHP では 0 も false も区別しないので、このように意図しない動作をします。

この意味不明な挙動の原因は、(1)で述べたような型の扱いのゆるさにあるらしい。そのため PHP では新たに === というイコール3連発の比較演算子が登場してます。上の例だと、if( $result !== FALSE ) とかにするしかなさそう。

あと変数が定義されているか調べる isset() という関数があるのですが、変数が定義されていても、その値が NULL だと「定義されてません」と返します。ほんとゆるゆる過ぎてお話になりません。(実際には empty() 関数などと組みあわせるほかありません)

 ってことで「PHPは初心者にも覚えやすい」って宣伝文句と「PHPは邪道」とプログラマーにバカにされているのどちらの主張もわかったような気がする。でも、簡単=初心者向け なのはいいけど、テキトー なのは初心者にとって非常にまずい気がする。計算の都合上、円周率や重力加速度を 3 や 10 にするのはよいけど、「円周率は3です」と教えるのはまずい的な…。個人的に、ちゃんとプログラムを学んでいきたいって人は、やはり Java をやるのがよろしいかと。


さて、次の目標はオブジェクト指向プログラミング。

オブジェクト指向でなぜつくるのか―知っておきたいプログラミング、UML、設計の基礎知識―

オブジェクト指向でなぜつくるのか―知っておきたいプログラミング、UML、設計の基礎知識―

  • 作者: 平澤 章
  • 出版社/メーカー: 日経BP社
  • 発売日: 2004/06/03
  • メディア: 単行本(ソフトカバー)

こんな本を買ってみました。まあ、本文にこれだけ“筆者”という単語がでてくる本はそうそう無いんじゃないでしょうか。何十ページものスペースを割いて、他のオブジェクト指向解説本でされている説明をことごとく批判し、一方筆者はこんなうまく説明が出来ると得意げに語っており、読んでで何だかイラッとしてきます。筆者は、巷に氾濫している悪しき解説本によって多くのプログラマーは「オブジェクト指向はこの世の理をすべてプログラムで表現できる魔法の手法である」という幻想にとりつかれていると主張していますが、そんなプログラマーに出会ったことはないし、仮にそういう人がいたら、読むべきなのはこの本ではなく「カルトから抜け出すには」みたいな本だと思う。題名が「なぜつくるのか」とあるように、オブジェクト指向を使ったプログラミングテクニックや、どういったところでオブジェクト指向と取り入れると、効果があるのかといったところはまったく解説されておらず、筆者の考えたらすんばらしい解説を披露されて終わります。たぶん、プログラムなんて書かない文系の管理職のおっさん向けの本なんだろうと思うけど、そのわりには なんちゃってJavaなコードが大量にでてくるので、プログラマーにも非プログラマーにもあまり得るものがない本になっている気がする。ただ、メモリ管理の章はとても興味深かった。

以上、プログラム歴 1週間のガキがほざきました。

nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

Facebook コメント

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。