PHP parentについて 【初級編 第49回】

この記事は2013年1月28日に書かれたものです。内容が古い可能性がありますのでご注意ください。


PHP parent

クラス

前回に引き続いて今回もクラスについて記述していきたいと思います。

親クラス内の静的なプロパティへのアクセス

以前、static文で宣言されたクラス内の静的なプロパティやメソッド(インスタンス化せずにアクセスすることができるプロパティやメソッド)へのアクセス方法で
クラス外や、自クラス内からのアクセス方法を記述しましたが、
基底クラスを継承した派生クラス内から、基底クラス内の static 宣言された静的なプロパティやメソッドへアクセスしたい場合は parent を使用します。

parentの記述方法

parent は派生クラス内から継承元の基底クラス内の static で定義されたプロパティやメソッドにアクセスする際に使用します。
具体的な記述方法は下記のようになります。

class 基底クラス名{
  static public プロパティ名 = '値';
  static public function メソッド名(){
    メソッド内の処理;
  }
}

class 派生クラス名 extends 基底クラス名{
  public funtion メソッド名(){
    parent::基底クラス内のstatic宣言したプロパティ名;
    parent::基底クラス内のstatic宣言したメソッド名();
  }

parentを使用したサンプル

以下では parent を使用して基底クラス内のメソッドにアクセスしてその値を表示しています。

<?php

  class test{
    static public $value1 = "1000<br>";
  }

  class subtest extends test{
     public function func1(){
       echo parent::$value1;
     }
  }

  $obj = new subtest;
  $obj->func1();

?>

結果は以下のようになります。
ブラウザ確認画像

基底クラスでは static 宣言しているので、下記のようにインスタンス化しなくても
クラス外からアクセスが可能なプロパティになっています。

<?php

  class test{
    static public $value1 = "1000<br>";
  }

  class subtest extends test{
     public function func1(){
           echo parent::$value1;
         }
  }

  $obj = new subtest;
  $obj->func1();
  echo test::$value1;

?>

結果は以下のようになります。
ブラウザ確認画像

static 宣言をしていないプロパティを派生クラス側から parent で参照しようとすると
エラーになってしまうので注意が必要です。

また下記のように static 宣言したメソッドも parent を用いてアクセスすることができます。

<?php

  class test{
    static public function func2(){
      echo "in func2<br>";
    }
    static public function func3(){
      echo "in func3<br>";
    }
  }

  class subtest extends test{
     public function func1(){
       echo parent::func2();
     }
  }

  $obj = new subtest;
  $obj->func1();
  test::func3();

?>

結果は以下のようになります。
ブラウザ確認画像

ただしプロパティの場合は static 宣言していないものを parent で参照するとエラーになりますが、
メソッドの場合は static 宣言していなくてもエラーにならずに実行できてしまいます。
以下は先ほどのコードから func2 の static を抜いて実行しています。

<?php

  class test{
    public function func2(){
      echo "in func2<br>";
    }
    static public function func3(){
      echo "in func3<br>";
    }
  }

  class subtest extends test{
     public function func1(){
       echo parent::func2();
     }
  }

  $obj = new subtest;
  $obj->func1();
  test::func3();

?>

結果は static 宣言していなくても同じになります。
ブラウザ確認画像

今回はここまでにします。

  • このエントリーをはてなブックマークに追加

PAGE TOP