WEBデザイン・開発講義WEB Design&Development Lecture

PHPのクラス・オブジェクトプログラミング

PHPのクラス・オブジェクトプログラミング

PHPクラス・オブジェクトの基本的な記述方法とプログラミング

PHPクラスの基本的な記述方法※画像クリックで拡大表示

※アイコンの機能:表示   実行  ダウンロード

  • PHPのクラス・オブジェクトは、
    クラス・オブジェクトの3大機能である「カプセル化」はアクセス修飾子で実現し、「継承」は単一継承のみで、「ポリモーフィズム」は抽象クラスインターフェースの機能で実現しています。多重継承は、インターフェースを活用して実現可能です。
  • PHPクラス・オブジェクトの利用概念
    PHPで実現する電卓機能は、クラス・オブジェクトを利用しない場合でも作成できますが、「クラスの定義」して、そのクラスを「オブジェクト作成」し、「プロパティ」参照や「メソッド」実行のプログラミングを事例として概念とルールの理解を深めます。
    PHPクラス・オブジェクトの概念:電卓機能の例
    1. クラスの定義は、4つの機能「プロパティ」「コンストラクタ」「メソッド」「デストラクタ(省略可能)」から構成され、カプセル化機能の「アクセス修飾子」である「public」や「private」などを指定します。
    2. クラスのインスタンス化(オブジェクト化):"new"する際に、引数を指定して初期データ設定などの「コンストラクタ」で定義している内容が自動的に実行されます。
    3. インスタンス化した変数(オブジェクト型)に「オブジェクト演算子:"->"」を付加し、クラスで定義した「プロパティ」や「メソッド」を指定することで参照・設定や実行ができるようになります。
    4. 「クラス定義」プログラムは、一般的に別ファイルにすることで、他のプログラムでその機能のクラス・オブジェクトを利用することが可能となり、プログラムの構造化や修正が簡単化などのメリットが計られます。
    項目PHPプログラム内容
    PHPクラス:電卓機能「PHPクラス定義の電卓機能のプログラム記述」
    「PHPクラス定義の電卓機能を利用したオブジェクト生成、プロパティ、メソッドのプログラム記述」
  • PHPクラス・オブジェクトの基本的な記述方法
    PHPクラス・オブジェクトの基本的な記述方法
    ※上記のPHPクラスの記述方法プログラム→
    1. クラスの定義は、
      「class "クラス名" { ... }」の形式で、中括弧の中にはクラスの「プロパティ」と「メソッド」の定義を記述します。クラスの中には、定数やプロパティ(変数)、メソッド(関数)を含めることができます。
    2. クラスのコンストラクタは、
      「__construct ([ = "" [, $... ]] )」の形式で、クラスのコンストラクタメソッドを宣言することができます。コンストラクタメソッドを有するクラスは、新たにオブジェクトが 生成される度にこのメソッドをコールし、必要な初期化を行うことができます。
      「継承」した子クラスのコンストラクタがある場合、親クラスのコンストラクタがコールされないので親クラスのコンストラクタを実行するには、子クラスのコンストラクタの中で「parent::__construct()」のコールが必要です。
    3. クラスのデストラクタは、
      「__destruct (void)」の形式で、特定のオブジェクトを参照するリファレンスがひとつもなくなったときにコールされ、またスクリプトの終了時にも順不同でコールされます。「exit()」関数で処理を停止した場合にもデストラクタはコールされます。
      コンストラクタと同様、親クラスのデストラクタを実行するには、 デストラクタの中で明示的に「parent::__destruct()」のコールが必要です。子クラスでデストラクタを定義していない場合は 親クラスのデストラクタを継承します。
    4. クラスのプロパティは、
      クラスのメンバ変数であり、プロパティを定義するには"public"、"protected"、"private"キーワードの「アクセス修飾子」のあとに通常の変数の宣言を記述します。宣言時に初期値を設定できますが、初期値は定数値でなければなりません。
    5. クラスのメソッドは、
      「[アクセス修飾子] function メソッド名 ([引数]){ ... }」の形式で、自分自身クラスを表す疑似変数「$this」が利用可能であり、「$this->プロパティ」のように記述します。
    6. クラスの継承(インヘリタンス)は、
      「子クラス名」として記述し、「親クラス(スーパークラス)」名の前に「extends」キーワードを宣言して、親クラスのメソッドとプロパティを継承することができます。
      継承されたメソッドやプロパティを「オーバーライド」するには、 親クラスで定義されているのと同じ名前でそれを再宣言します。但し、親クラスのメソッドが「final」定義されている場合はオーバーライドできません。
    7. オブジェクト(インスタンス)は、
      new "クラス名"([引数])」の形式で、クラス名の前に"new"キーワードを使い、インスタンス化することができます。「引数」の内容が設定されている場合は、インスタンス化される前にクラスのコンストラクタ処理がコールされます。
    8. オブジェクトのプロパティ、メソッドは、
      オブジェクト化された変数を利用して、「オブジェクト演算子:"->"」を付加して、クラスのプロパティやメソッドのアクセス("public"のアクセス修飾子付きのもののみ)ができ、「オブジェクト変数->プロパティ」「オブジェクト変数->メソッド()」の形式で記述します。

PHPクラスのプログラミング

  • PHPクラス・オブジェクトプログラミングの記述方法は、
    項目PHP記述と説明
    プログラム内容
    PHPクラスの基本構成とオブジェクト生成、プロパティ、メソッドの記述■クラスの定義:classキーワード
    ■コンストラクタのメソッド:__construct
    ■デストラクタのメソッド:__destruct
    ■インスタンスの生成:newキーワード
    ■インスタンス操作(プロパティ、メソッド)のオブジェクト演算子:「->
    this演算子「$this->xxx」→クラスのインスタンス化された自分自身の指示
    ■アクセス修飾子:カプセル化
    public→全てのクラスからアクセス可能
    varも同様、省略した場合も同様)
    protected→クラス自身とそのクラスを継承したクラスからのみアクセス可能<
    private→定義クラスからのみアクセス可能
    「PHPクラスの基本構成とオブジェクト生成、プロパティ、メソッドの基本的な記述方法」
    PHPクラスの継承■クラスの継承:extendsキーワード
    「PHPクラス・オブジェクトの基本的な記述方法とクラス継承、スコープ定義演算子"::"の利用方法」
    PHPクラスのスコープ定義演算子と静的な定義:static■スコープ定義演算子:「::」→プロパティやメソッドをクラス定義の外からアクセス(オブジェクト生成なしで)
    self::xxx→自分自身
    parent::xxx→親クラス
    static::xxx→静的クラス
    ■静的な定義:static キーワード→クラスプロパティもしくはメソッドをstaticとして宣言することで、クラスのインスタンス化の必要なしにアクセスすることができます。
    「PHPクラス・オブジェクトの定数クラス継承と各種キーワードのスコープ定義演算子"::"の組合せ利用方法」
    PHPクラスのポリモーフィズム■PHPのポリモーフィズムは、クラスは異なっても同名のメソッドで異なる処理を実現させること、インターフェイスや抽象クラスと似た実現方法となります。
    「スーパークラス」で中味がないシグニチャのみのメソッドを定義し、継承した「サブクラス」で「同名のスーパークラス・メソッド」をオーバライドする形で実現しています。「サブクラス・メソッド」に"final"定義して、継承した「クラス・メソッド」のオーバライドを禁止化することができます。
    「PHPクラスのポリモーフィズムを理解する上での図形の面積計算の例」
    PHPクラスの抽象化■抽象クラスは、クラスに「abstract」を宣言して、インスタンス作成不可のクラスとなります。主にメソッドの宣言を記述しておき、他のクラスで継承して活用します。
    ■抽象メソッドは、メソッドに「abstract」を宣言し、本体を持つことができませんのでメソッド名と引数だけを定義して、メソッドのシグネチャも必ず一致させます。抽象クラスを継承した派生クラスでオーバーライドして活用します。
    「PHPクラスの抽象クラスの記述と継承したクラスでのメソッド全ての記述が必要の例」
    PHPクラスのインターフェース■インターフェースは、キーワード「interface」により定義され、通常クラスと同様に定義し、メソッドの実装は定義が不可となります。通常クラスと同様にインターフェイスも「extends」演算子で継承することができます。
    ■インターフェイスを実装するには、「implements 」演算子を使用し、 このインターフェイスに含まれる全てのメソッドを実装する必要があり、まったく同じシグネチャを持つメソッドとなります。
    「PHPクラスの入力と出力のインターフェースに対しインターフェースの多重継承して、ファイルの入出力処理のインターフェース実装を実現」
    「PHPクラスの継承インターフェースをインターフェース多重実装して、カート機能の一部処理事例」
    PHPクラスのオートローディング__autoload()関数:未定義のクラス/インターフェイスを使用しようとした時に 自動的に呼び出される特別な関数であり、呼び出した未定義のクラス名が引数として渡されるもの。
    __autoload()関数を利用すると、クラスごとにrequire_once関数を呼び出す必要がなくなるので、コーディングがシンプルになり、クラスが呼び出されたタイミングで自動的に同名のクラスファイルをinclude_onceするような用途で使用する。 「クラス名.class.php」のような形式であらかじめファイル名に一定の規則性を設けた上で、__autoload関数内でrequire_once関数を呼び出す。
    spl_autoload_register()の方を推奨
    【1/2】「PHPクラスのオートローディング実行ためのクラス定義」
    【2/2】「PHPクラスの__autoload()関数利用:オートローディングを実行」
    PHPクラスにおける特殊関数:マジックメソッド■「__」で始まる関数名を特殊関数として予約していて、利用しないようにします。「__construct()」「__destruct()」「__isset()」「__unset()」「__get()」「__set()」「__call()」「__toString()」「__sleep()」「__wakeup()」「__set_state()」「__clone()」「__debugInfo()」とPHP5.3以降対応の「__callStatic()」「__invoke()」があります。
    ■__call()関数:存在しないメソッドがコールされたときに自動的に呼び出される特殊な関数で、引数として、コールされた「メソッド名」と「引数」(配列)が渡されます。
    ■「__get()関数」:アクセス不能プロパティからデータを読み込む際に使用、「__set()関数」:アクセス不能プロパティへデータを書き込む際に実行(クラスの外部からアクセスした場合にのみ「private $xxx=2;」がオーバーロードされます)
    __call()関数:「PHPクラスの存在しないメソッドの自動的コールを実行する利用方法」
    __get(),__set()関数:「PHPクラスのアクセス不能プロパティへデータを書き込む際に実行する利用方法」
    PHPクラスオブジェクトのinstanceof型演算子instanceof型演算子:instanceofを使用して、ある変数が特定のクラスのオブジェクトか、親クラスを継承したクラスのオブジェクトか、インターフェイスを実装したクラスのオブジェクトかなどを調べます。
    「PHPインターフェース実装したクラスのオブジェックト変数がどのような型かを調査するプログラム内容」
    PHPクラスの無名関数の利用(PHP5.3以降対応)■無名関数はクロージャとして使用することができ、関数名を指定せずに関数を作成できるようにするものです。 コールバックパラメータとして使う際に便利です。
    「PHPクラスのプロパティにコンストラクタで無名関数を設定して、オブジェクトのプロパティ内容を実行する利用(クロージャを返すメソッド)」
  • PHPのクラス・オブジェクト概要まとめ(PDF)

PHPクラスオブジェクト補足

PHPリファレンス

参考資料の表示

pagetopへ