Data, Control flow
データ,制御構造

注意事項

毎回の授業の最初に出席メールを提出せよ.

前回の出席記録を確認せよ.出席メールを授業時間内に 送信したのに記載されていない学生はメールの自分宛のコピーを印刷し,宛先アドレス, 提出時間が間違っていないことを確認してから申し出よ.

2 章 つづき

2.2 データ型

整数の表記は.8 進,16 進の表記も含めて C と同じ.

浮動小数点数の表記も C と同じ.浮動小数点は有限桁の近似値で 扱われる.2 個の浮動小数点数がを == で比較するようなコードを 書いてはいけない.

C と大きく異なるのは変数に型宣言が必要ない点である.同じ変数に 自動的にいろいろな型のデータが格納される. 現在格納されているデータの型を知るために is_int(), is_float() 関数がある.

C と違い,単独変数に文字列を格納できる.

シングルクォートとダブルクォートの違いは,ダブルクォートでは 文字列中の変数が展開される点."\n"など C と同様のエスケープシーケンスが 使える.

この教科書のプログラム例ではプログラムのすぐ後に出力結果が書かれている ので注意せよ.教科書p.28下の5行は上の 3 行がプログラムで残りの 2 行が出力結果である.プログラムの 3 行だけを以下のphpタグの中に書き, 拡張子を.php としてファイルを作成し,サーバに転送して動作を確認せよ.

php の外枠

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="ja">
  <head>
    <title>sample</title>
  </head>
  <body>
    <p>
<?php
ここにphpコードを書く
?>
    </p>
  </body>
</html>

false 扱いになる値はとしてよく使われるのはキーワード false, 整数 0, 空文字列.

配列の添字は 0 から始まる.C と違い,文字列を配列の添字として使える.

p.30の下の例4行の後,p.31 の上の例の6行目までを php の外枠の 中に書き,実行してみよ.例の下の出力が得られることを確認せよ.

オブジェクト指向プログラミングもサポートされている.class は, C でいう複合データの型の構造体 struct を使って何らかの目的をもって設計 された データ とそのデータを扱う 関数 がセットになったものと認識すればよい.コードの再利用に有利.詳しいことは ここでは省略.

リソースについてはここでは省略

null は何も値が代入されていないことを示す.is_null() で調べることができる.

2.3 変数

変数の前にドル($)記号をつける.変数には任意の型の値を格納することができる. また,使用する前に明示的に宣言する必要はない.最初に値が代入されたとき データ型が決まる.値が設定されていない変数には null 値が設定されているもの とみなされる.

$white という変数がもともと存在していたとき,$black =& $white で全く同じ変数を指す別の変数名 $black を作ることができる. $black と $white は実体は同じなので一方の内容を変更すると 他方の名前でアクセスしてもその変更は反映されている.教科書 p.34 から p.35 にかけての例はそれを示すもの.

変数のスコープについては関数内で初めて使われた変数 (C で言えば関数内で宣言された変数) はその関数内のみのローカルスコープ, 関数外で初めて使われた変数はグローバルスコープとなる. ローカルスコープの変数で関数が終了したあとも値を保持したいときは static を使う.

配列変数どうしの代入では代入した時点では値のコピーは行われず, 同じデータを共有する.両者の内容が別のものになった段階で配列のコピーが 行われる.内部的にコピー操作を必要最小限に押さえているが,使う側からみると 最初の代入操作で文字通りコピーが行われていると考えて使ってよい.

PHP では参照カウンタを用いてメモリを管理している.これは,すべての データについて,何個の変数名から参照されているかを記録するカウンタである.

2.4 式と演算子

C と同様なので省略する.p.39 の優先順位の表は重要なので必要になれば そのつどチェックするように.

p.41 暗黙の型変換に注意.

p.42 除算が C と異なる.C では <整数>/<整数> は,割り切れない場合は切り捨てを行った整数になるが PHP では 切り捨てず浮動小数点数になる.

C にはない文字列連結演算子 "." が存在する.p.42 の例は暗黙の型変換が 行われる例.

C と同様のインクリメント,デクリメント演算子が使える.

p.43 比較演算子 "===" は暗黙の型変換を行わないので型がわからない ときに型まで一致しているかどうかを調べることができる.

p.44 ビット演算子から p.48 代入演算子は C と同様なので省略.

p.49 その他の演算子は省略

2.5 フロー制御文

必要なときに参照すればよいので省略. C のように書く事もできるが,括弧を使わない以下のような記法もある.

例 1

if ("式") :
  "文 1";
else : 
  "文 2";
endif;

2.6 外部コードの読み込み

省略

2.7 ウェブページへの PHP の埋め込み

大枠は HTML 文書であり,その中に PHP スクリプト部分が 埋め込まれる.この授業では 2.7.1 節の 「XML 形式」を使用する.

要するに "<?php" と "?>" で囲まれた部分が PHPスクリプトとして 認識,処理され,出力結果でその部分が置き換えられる.

2.7.2, 2.7.3, 2.7.4, 2.7.5 は省略.

3 章 関数

3.1 関数の呼出し

PHP の関数の仕様は以下のリンクから検索できる.
PHP日本語マニュアル

呼び出し方は C と同様

p.68 の以下の例では or を制御構造として使用している. なじみのない使い方だが perl では一般的なので知っておくほうがよい.

例 2

$result = unlink("functions.txt") or die("処理に失敗しました!");

"or" は左辺から評価し,短絡処理を行う.(p.46 参照) "A or B" の場合,A から評価するが,A が true であれば残りを評価しなくても 全体が true であることが確定するので残りの処理をしない.(短絡処理) このため,B の位置に置かれた式は A が false のときのみ処理される. これを if 文のかわりに選択構造として利用している.

p.68 関数の定義もだいたい C と同様. return 文に到達するとその値を返す. 関数名の前に & を付けて定義すると値のコピーではなく値の参照 を返す.配列など大きなデータを return するときに資源を節約できる.

教科書 p.69 例 3-3 は関数の使用の例である.実際に動作させてみよ. ただし,関数に関する部分だけしか書かれていないので以下の外枠に 組み入れて ex3-3.php という名前のファイルを作成し,公開せよ.

PHP を組み込むための HTML文書の外枠

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="ja">
  <head>
    <title>ex3-3</title>
  </head>

  <body>
    <p>

    ここに p.69 例 3-3 のコードを書く

    </p>
  </body>
</html>

3.3 変数のスコープ

関数の内部で最初に出て来た変数はその関数内部でしか使えない(ローカル変数) p.71 上側の例には $a が 2 個使われているが,最初のものがグローバル変数, 後のものがローカル変数である.別の変数として扱われる. 最後の echo $a で何が表示されるか考察せよ.

グローバル変数を関数内で使用するためには p.71 下側の例のように global キーワードが必要.忘れると上の例のように別のローカル変数として作成されて しまう.

static 変数を C と同様に利用することができる. スタティック変数はローカル変数でありながら関数値を保持しつづける. p. 72 例 3-4 のようなカウンタに利用する.上の HTML文書の外枠 に組み込んで動作確認せよ.

3.4 関数のパラメータ

値渡しと参照渡しの違いを理解せよ. 値渡しが通常の C のパラメータの渡し方に相当する.

パラメータリストの中でパラメータ名の前に & を付けることで その変数を参照渡しとして宣言することができる.(p.73 例 3-5) これを使って C でいうポインタ渡しと同様のことができる. 呼び出すときは通常の関数と同様に呼び出すが,参照渡しで定義してある 関数では呼出し元の変数の値を変えることができる(値渡しではできない)

p.74 上の例の方法でパラメータのデフォルト値を設定することができる.

パラメータの個数を可変にできる.パラメータリストを空にして関数を宣言すればよい. 関数内で func_num_args(); でパラメータの個数, func_get_args(); で与えられた全パラメータの配列を得ることができる.

3.5 返り値

return 文で返り値を 1 つだけ返せる.配列を返すこともできる.

3.6 可変関数

p.77 最初の例のように関数名を変数で指定することができる

3.7 無名関数

その場限りの関数用に名前のない関数を作成することができる.

usort()はユーザ定義の順序でソートを行う関数で,引数を 2 個とる. 第2引数でソートの基準となる関数の関数名を渡す.p.77 一番下の例 では create_function() で無名関数を作成(実際にはランダムな関数名が 与えられ,戻り値になる.)これを変数(この例では $lambda )に格納し, usort($array, $lambda) で第 2 引数として渡している.

第 2 回課題「制御構造」 を提出せよ.


Updated in April 28, 2010, index.html, Yamamoto Hiroshi