2013年3月29日金曜日

PHP講座 week-3; OOP

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

実際に講義したのは先週の事になるけれど、PHPにおけるOOP(オブジェクトオリエンテッドプログラミング)周りの言語機能の解説を行った。つまるところクラスとかインターフェースとか。

以下、講義内容から要点を抜粋してメモ。
  • クラスとオブジェクト
    • PHPも今ではまともなOOP言語の仲間になりつつある
    • 基本的にはJavaやC++の様にclassキーワードでオブジェクトの設計図たるクラスと呼ぶ定義を行える
以下、「PHPにおいては」である事に注意を要する。例えばOOP言語全般についてクラスのプロパティはメンバー変数の事かと言えばそれは違う(例えばC#)。
  • クラス(≈C++風に言えばユーザー定義
    • classキーワードで定義する
    • new演算子でインスタンスを作成できる
      • コンストラクターに実引数を与えない場合は()を省略してもよい
    • メンバーの定義はアクセス指定子(可視性)を付ける
      • private, protected, public
      • デフォルトはpublic(後方互換性のため)
    • メソッド … クラスが持つ関数
    • プロパティ … クラスが持つ変数
    • メンバー(メソッドやプロパティなど)へのアクセス演算子
      • -> インスタンスメンバーへ
        • 例: new i = C; i->example_func()
      • :: 静的メンバーへ
    • オブジェクト定数 … クラスが静的に持つ定数
      • defineじゃなくてconstで定義(これはC++風)
    • マジックメソッド … 特別な扱いとなる特定の名前のメソッド群
      • コンストラクターデストラクター
    • 継承
      • PHPは多重継承不可(JavaやC#ど同様)
      • キーワード extends で継承元を定義(Java風)
    • static … プロパティの静的化
      • インスタンスによらずクラスに静的に束縛されるプロパティを持てる
      • 通常は積極的に使用(乱用)しないこと。
        (OOPの意味が無くなるような使い方もできてしまう)
    • final … 継承禁止
      • classを継承禁止にする
      • メソッドに付けると継承クラスでのそのメソッドの上書きを禁止する
    • $thisインスタンス自身
      • メソッド内部で自身のインスタンスを示す特別な変数
      • メンバーへのアクセス演算子は ->
        (インスタンスゆえ)
    • 遅延静的束縛評価時に静的なクラス情報へアクセスする手段
      • parent、self
      • メンバーアクセス演算子は :: 
        (静的ゆえ)
  • 抽象クラス
    • abstractキーワードを付与したclass
      • または一部メソッドにabstractを付与し実装を伴わないメソッドをもたせたクラス
    • newでインスタンス化できない
    • 継承して用いる
  • インターフェース (≈JavaやC#風)
    • interfaceキーワードで定義する
    • publicメソッドのシグニチャーの定義のみ含める
      • メソッドの本体は実装(記述)しない
      • interfaceの役割(意味)を考えればpublicしか無い理由も分かる
    • implements キーワードでクラスに実装を宣言する
      • インターフェース自身は実装を伴わないからインスタンス化もできない
    • interfaceはinterfaceへとextendsで継承可能
    • interfaceにconstで定数をもたせる事もできるがおすすめしない
      • 同名のconstを持つinterfaceをimplementsしたりすると多重継承となりエラーで止まります
      • 用いる場合には慎重に設計しなければならない、というかおすすめしない
  • トレイト … クラスの欠片みたいなもの
    • それ自身はインスタンス化できないクラスの欠片のようなもの
    • traitキーワードで定義
    • useキーワードで使用を宣言
      • asで別名にする事も可能
      • asでアクセス指定子の制限も可能
    • traitの定義でuseによる他のtraitの取り込みも可能
    • 他のOOP言語でもまだ実装例は少ないが、複雑な継承関係を設計したい場合やコード片の流用に有効な機能
      • 縦の継承に対する横の継承みたいな概念の何かそういうの
      • 多重継承に変わる複雑なクラス設計への対応に使用可能
  • tips
    • 型ヒント
      • メソッドの仮引数に型を明示して制限できる
      • 但しintやdoubleなどのプリミティブ型は不可
      • オブジェクトたりえるクラスのみ使用可能
    • クラスのインスタンスの比較
      • ==、!=では同じクラスのインスタンスならtrue、false
      • ===、!==では同じインスタンスであればtrue、false
    • クラスのインスタンスへのforeach
      • プロパティを取り出せる
      • foreachした場所からの可視性に制限される
    • シリアライズ
      • シリアライズ: オブジェクトの状態を文字列に変換
      • デシリアライズ: 文字列からオブジェクトを復元
    • (PHPにおける)オーバーロード
      • 設計も実装も保守もカオスになるので通常は使わない
      • 一般にOOP言語の実装で言うオーバーロードでは無い
      • 一般に言うならば動的クラスとか(C#で言えばDynamicObject)
      • マジックメソッドを用いて実現する
Javaなどひと通りはOOPベースのプログラミングについて知っている学生を対象にしている事もあり、途中派生周りなど念の為に図解するなどはしたものの、OOP自体についてはやや解説を端折れたので数コマの範囲で終えられた。

引き続き、講座では名前空間、例外などの言語機能や対話シェル、ビルトインウェブサーバーなどの実装機能を紹介しつつ、小規模なアプリケーション開発プロジェクトを並行して進める事にしています。

0 件のコメント:

コメントを投稿