Tips

2014.09.16

PHP 継承とコンストラクタ、デストラクタ1 【初級編 第58回】

PHP

クラス

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

継承を用いた場合のコンストラクタやデストラクタ

以前、コンストラクタやデストラクタについて記述しましたが、
今回は継承をした場合にコンストラクタやデストラクタがどのような動きをするのかについて
記述したいと思います。

コンストラクタの場合

<?php
  class class01 {
    public function __construct(){
      echo "class01内の処理";
    }
  }

  class class02 extends class01 {
  }

  $obj = new class02;

?>

この場合の結果は以下のようになり、基底クラス側のコンストラクタをちゃんと呼び出します。

ブラウザ確認画像

以下のようにすればメンバメソッドも呼び出すことができます。
メソッドの場合は static の記述をつけなくても、
静的な静的アクセスとインスタンスメソッドへのアクセス両方対応しているようです。

<?php

	class class01{
		public static $var = 10;    //static の記述を抜くとエラーになる
		public function func01(){
			echo self::func02();
		}
		public function func02(){   //static の記述を抜いてもエラーにならなかった
			echo self::$var;
		}
	}

	$obj = new class01();
	$obj->func01();

?>

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

以下のようにクラス外から selfを使用して静的なアクセスをすることはできません。
下記の場合はエラーになります。

<?php
error_reporting(E_ALL ^ E_NOTICE);  //デバッグを表示するため
ini_set('display_errors', '1');     //デバッグを表示するため

        class class01{
                public static $var = 10;
                public static function func01(){
                        echo self::func02();
                }
                public static function func02(){
                        echo self::$var;
                }
        }

        self::func01();

?>

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

クラスを継承した派生クラス側から基底クラスの静的メンバ変数を呼び出すこともできます。
この場合はエラーなく表示することができます。

<?php

	class class01{
		public static $var = 10;
	}

	class class02 extends class01{
		public static function func02(){
			echo self::$var;
		}
	}

	$obj = new class02();
	$obj->func02();

?>

結果は以下のように10と表示されます。
ブラウザ確認画像

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

新連載はじまりました!新PHP基礎 連載リンク

PHP基礎 連載

Recent News

Recent Tips

Tag Search