特集PC技術

例で覚えるPHP

 

第8回 クラスとオブジェクト

1.クラスとインスタンスの作成

PHPでは型の概念が強くなく、構造体が使えませんが、クラスを用いることで代用ができます。 また、オブジェクト指向の持つ代表的な機能である継承、コンストラクタ、アクセス権による情報の隠蔽等の利用が可能です。 ただし、Javaと同じようにクラスの多重継承は認めていません。
クラスを作成する場合は、クラス名の前に「class」キーワードを置きます。 {}の内側でフィールドやメソッドの定義を行います

	<?php

	  class testclass_car{
	    public $carname="z";
	    public $carprise=20000000;

	    function carprise_intax(){
	      $tax = $this->carprise*0.05;
	      return $this->carprise+$tax;
	    }
	  }

	  
	  $inst = new testclass_car();

	  echo "販売価格=";
	  echo $inst->carprise_intax();
	  echo "円(税込)<br>";
	?>

	

実行結果:
税込み価格が出力

定義したクラスを実際に用いるときは、new演算子を用いてインスタンスを作成します。 作成したインスタンスからフィールドやメソッドを参照する場合には、アロー演算子「->」を用います。

2.コンストラクタとデストラクタ

インスタンスが作成された時点で実行されるコンストラクタ、 インスタンスが破棄される、もしくはスクリプトが終了する際に実行されるデストラクタを、それぞれ定義することができます。 コンストラクタの場合はメソッド名を__construct()、デストラクタの場合は__destruct()とします。 コンストラクタの場合は、クラス名と同じメソッド名の場合もコンストラクタとして処理されます。 またデストラクタには、特定の引数を取ることはできません。

	<?php

	  class testclass{
	    private $value;

	    function __construct(){
	      $this-?>value = 100;
	      echo "コンストラクタが実行されました<br?><br?>"; 
	    }

	    function __destruct(){
	      $this-?>value = 0;
	      echo "<br?><br?>デストラクタが実行されました"; 
	    }

	    function getvalue(){
	      return $this-?>value;
	    } 
	  }


	  $inst = new testclass();
	  echo $inst->getvalue();


	?>

	

実行結果:
コンストラクタとデストラクタが出力される

3.クラスの継承

既存のクラスを継承することで、機能の追加実装等が簡単にできます。 継承する場合は、クラス名の次に「extends 継承元のクラス名」と置きます。

		<?php

	  class testclass{
	    protected $value;
	    
	    function __construct(){
	      $this->value = 100;
	      echo "コンストラクタが実行されました<br>";
	    }

	    function look(){
	      echo $this->value."<br>";
	      return;
	    }
	  }

	  class subtestclass extends testclass{
	    function __construct(){
	      parent::__construct();
	      echo "こちらはsubクラスのコンストラクタです<br>";
	    }

	    function change($x){
	      $this->value = $x;
	      return;
	    }
	  }


	  $inst = new testclass();
	  $inst->look();

	  echo "<br>";

	  $inst2 = new subtestclass();
	  $inst2->change(50);
	  $inst2->look();

	?>

	

実行結果:
サブクラスで値を書き換える関数を定義

継承先のクラス内では、継承元のクラス内で定義されているメソッドを新たに定義しなおす事ができます。 これをオーバーライドといいます。 やり方は、継承先のクラス内で同じ名前のメソッドを定義するだけです。 継承元のメソッドにアクセスしたい場合は、継承先のメソッド内でparent::メソッド名と記述します。

	<?php

	  class testclass{
	    public $value;

	    function __construct(){
	      $this->value = 100;
	      echo "コンストラクタが実行されました<br>";
	    }

	    function access_value(){
	      echo $this->value;
	      return;
	    }
	  }

	  class subtestclass extends testclass{
	    function __construct(){
	      echo "サブクラスの";
	      parent::__construct();
	    }

	    function access_value(){    //オーバーライド
	      echo "オーバーライドしました<br>";
	      parent::access_value();

	      echo "<br>値を書換えます<br>";

	      $this->value = 50;
	      parent::access_value();
	    }
	  }    
	  


	  echo "親クラスは出力のみを行う<br><br>";
	  $inst = new testclass();

	  $inst->access_value();

	  echo "<br><br>だが子クラスは書換えも行う<br><br>";
	  $inst2 = new subtestclass();

	  $inst2->access_value();


	?>

	

実行結果:
オーバーライドした関数は書き換えも同時に行う

4.アクセス権

クラス内の各フィールドやメソッドには、アクセス権を定めることができます。 アクセス権は他の言語と同じようにprivate、protected、publicの3つが存在します。 それぞれの役割も他の言語と大きな違いはありません。 各フィールドやメソッドにアクセス権を定めると、そのフィールドやメソッドに対してのアクセスを制限することができます。
・privateなメソッドやフィールドに対しては、同じクラス内からのみアクセスすることができます。
・protectedなメソッドやフィールドに対しては、同一クラス内と継承先のクラスからアクセスする事が可能です。
・Publicなメソッドやフィールドに対しては、どこからでもアクセスが可能です。

	<?php
	  class testclass{
	    private $prv_value="private";
	    protected $prt_value="protected";
	    public $pub_value="public";

	    function look(){
	      echo $this->prv_value."<br>";
	      echo $this->prt_value."<br>";
	      echo $this->pub_value."<br>";
	    }
	  }

	  class subtestclass extends testclass{
	    function look_sub(){
	//      echo $this->prv_value."<br>";  //継承先からのアクセスは不許可
	      echo $this->prt_value."<br>";
	      echo $this->pub_value."<br>";
	    }    
	  }

	  
	  $inst = new testclass();
	  echo "同クラス内からのアクセス<br>";
	  $inst->look();  

	  $inst2 = new subtestclass();
	  echo "<br>継承クラス先からのアクセス<br>";
	  $inst2->look_sub();

	  echo "<br>クラス外からのアクセス<br>";
	//  echo $inst->prv_value."<br>";  //クラス外からのアクセスは不許可
	//  echo $inst->prt_value."<br>";  //クラス外からのアクセスは不許可
	  echo $inst->pub_value."<br>";

	?>

	

実行結果:
アクセスに成功する部分のみを出力

コメントの投稿


画像の中に見える文字を入力してください。

トラックバック

Sex toys UK

例で覚えるPHP 第8回 クラスとオブジェクト - ほぷしぃ

2021年4月 6日 04:32

トラックバックURL

http://www.isl.ne.jp/cgi-bin/mt/mt-tb.cgi/1560

pagetopこのページの先頭へ戻る