2013年3月12日火曜日

PHP講義メモ week2-1

かくかくしかじか、学生向けにPHPを教えている。シラバスはこんな具合

今回はシラバスの2.PHP言語基礎b.型の途中から。

言語を知る上で型システムはとても重要な仕組みだし、PHPの組み込み型は実行するPHP自身を翻訳したC処理系にも強く依存し、それにPHPはとにかく暗黙の型変換が変態的に行われるので危険性の解説も大切。そんな訳でこの節はシラバスでは1つの項目でしかないけれど、講義では数時間掛けて丁寧に解説しています。

今回は浮動小数点数型の解説から、文字列型配列型の触りまで。以下は講義内容からtips的に列挙してメモ。

  • 浮動小数点数型
    • たぶんきっとIEEE754 Binary64 です
      • 厳密に言うと整数型と同様に実行するPHPを翻訳したC処理系のdouble型に依存します
    • リテラルに注意
      • doubleとfloatという精度の概念が無いし、上記依存のdoubleしか無いのでCなんかの 1.23f みたいなfloatっぽいリテラルは構文エラーになりマス
      • 1.23 .456 7e8 9e-10 など使用可
        (厳密にはマニュアルの正規表現で書かれた規約を参照のコト)
    •  有限の精度丸めに注意が必要なコトはPHPに限らず重要デス
    • NaNとか無限大もあるので注意
  • 文字列型
    • Cみたいに文字型ってのは無いからね
      (要素1文字の文字列型はもちろん使えるけど)
    • リテラルは2×2種類(言語仕様的に細かく言うと4種類だけど)
      • 'hogehoge'
        • 通常はこれを使うコト(内挿等の事故防止の為)
      • "fugafuga"
        • 文字列への内挿表現やエスケープシーケンスが使える
          • 誤発動させない為にそれら機能を使わない時はシングルクォートの文字列リテラルを使った方が良いでしょう
        • 例: http://ideone.com/KQyJsD
      • <<<EOT …(改行もそのまま文字列変数になるよ)… EOT;
        • ヒアドキュメントっていう
        • 内挿やエスケープシーケンスが有効な事に注意
      • <<<'EOT'で始めるとシングルクォート版の文字列リテラルと同様に変数の内挿やエスケープシーケンスを処理しない
        (マニュアル的に言うと5.3.0から使えるnewdoc構文てやつ)
    • ダブルクォート版の内挿とエスケープシーケンスに注意
      • $は変数へのアクセスを示すから$文字そのものを使いたい場合はエスケープシーケンスにしないと思わぬ挙動になるだろうから注意すること
    • 暗黙の型変換に細心の注意を払うコト
      • var_dump('123" + '456') → int(579) : http://ideone.com/Sr35In
      • var_dump(123 + 'Alice') → int(123) : http://ideone.com/zOnjMj
      • var_dump('60' - '3.5 minutes ago') → float(56.5) : http://ideone.com/hMk8WL
      • var_dump('3E7' * '.8') → float(24000000) : http://ideone.com/ymmkgw
      • HTMLのformとの連携では文字列を数値に暗黙的に変換してくれることは確かに便利な事はあるが、プログラマーにとっての弊害も大きいのでとにかく注意するコト
  • 配列型
    • 名前からはCの配列みたいなものを想像させるだろうけど全くベツモノなので要注意するコト
    • リテラルは2種類あるけど使うのは[]だけでいいよ
      (PHP5.4以降の比較的新しい糖衣構文デス)
      • $hoge = array( 'key1' => 'value1', 'key2' => 'value2', 'key2' => 'value2' )
      • $fuga = [ 'key1' => 'value1', 'key2' => 'value2', 'key2' => 'value2']
    • 要素は「map型」という特殊な型と考える
      • map型はkeyとvalueを結びつけて保持するデータ型
        • keyは整数または文字列の何れか
        • valueは何でもアリ(配列の入れ子も可)
    • リテラルのkeyは省略すると0から始まる数値が自動的に適用される
    • リテラルのkeyは整数リテラルまたはそれっぽい文字列の場合は整数として認識されるので要注意
    • 配列のkeyは不連続で構わない
      (とりあえずは名前付け程度のモノと認識しておいて構わない)
  • おまけ: プログラミングの用語tips
    • 連想配列
    • プログラミング言語のパラダイム
言語基礎を教えはじめたばかりの段階ですし、現段階では濃ゆ過ぎる話はしていませんがあしからず。

0 件のコメント:

コメントを投稿