2013年2月3日

php コンストラクタとデストラクタ




コンストラクタの実行タイミングは分かるけど、
デストラクタの実行タイミングがいまいちよく分かりません。

そこで、下記を参考に


参考:http://php.net/manual/ja/language.oop5.decon.php
引用-----------------------------------------------
デストラクタメソッドは、 
特定のオブジェクトを参照するリファレンスがひとつもなくなったときにコールされます。 
 あるいは、スクリプトの終了時にも順不同でコールされます。


ふむふむ。


class BaseClass
 {
  public $publicVar = 'In Base Class public value';
  protected  $protextedVar = 'In Base Class protected value';
  private $privateVar='In Base Class private value';
  
 function __construct() 
 {
  print'In Base Class __constructor';
 }
 
 function __destruct()
 {
  print'In Base Class __destructor';
 }
 
 function viewPrint() 
 {
  var_dump($this);
  print'In Base Class viewPrint';
  
 }
 
 public function setPublicVar($x){ $this->publicVar=$x; }
  public function setProtextedVar($x){ $this->protextedVar=$x; }
 public function setPrivateVar($x){ $this->privateVar=$x; }
 
 public function getPublicVar(){ return $this->publicVar; }
 public function getProtextedVar(){ return $this->protextedVar; }
 public function getPrivateVar(){ return  $this->privateVar; }
 
 }
 
 class SubClass extends BaseClass
 {
  public $publicVar = 'In Sub Class public value';
  protected  $protextedVar = 'In Sub Class protected value';
  private $privateVar='In Sub Class private value';
  
  function __construct() 
  {
   parent::__construct();
  print'In Sub Class __constructor';
  }
  
  function __destruct() 
  {
   parent::__destruct();
   print'In Sub Class __destructor';
  }
  public function setPublicVar($x){ $this->publicVar=$x; }
  public function setProtextedVar($x){ $this->protextedVar=$x; }
  public function setPrivateVar($x){ $this->privateVar=$x; }
  
  public function getPublicVar(){ return $this->publicVar; }
  public function getProtextedVar(){ return $this->protextedVar; }
  public function getPrivateVar(){ return  $this->privateVar; }
  
  }
 
 $baseClassObj = new BaseClass();
 $baseClassObj->viewPrint();
 
 $subClassObj = new SubClass();
 $subClassObj->viewPrint();




---------------------------------------------------------------------
OutPut

In Base Class __constructor   <------base class="xdebug-var-dump" dir="ltr" pre="">object(BaseClass)[1]
  public 'publicVar' => string 'In Base Class public value' (length=31)
  protected 'protextedVar' => string 'In Base Class protected value' (length=34)
  private 'privateVar' => string 'In Base Class private value' (length=32)

In Base Class viewPrint    <------ ase="" class="" code="">リファレンス
In Base Class __constructor    <------base br="" class="">
In Sub Class __constructor     <------sub ase="" class="xdebug-var-dump" dir="ltr" pre="">
object(SubClass)[2]
  public 'publicVar' => string 'In Sub Class public value' (length=30)
  protected 'protextedVar' => string 'In Sub Class protected value' (length=33)
  private 'privateVar' => string 'In Sub Class private value' (length=31)
  private 'privateVar' (BaseClass) => string 'In Base Class private value' (length=32)

In Base Class viewPrint <-------- br="" class="" sub="">In Base Class __destructor <-------- br="" class="" parent::__destruct="" sub="">In Sub Class __destructor   <-------- br="" class="" sub="">In Base Class __destructor <-------- base="" class="" code="" ub="">
                                         Base Class最後のリファレンスとなり、
                                         最終的にBase Class デストラクタがCallされる

なるほど。
最終的に Sub Classのデストラクタ後に親クラスのBase ClassデストラクタがCallされた。
一つ勉強になった。


 

0 件のコメント: