PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHPのコンストラクタとデストラクタの基礎を徹底解説

はじめに

オブジェクト指向プログラミングにおけるコンストラクタとは、クラス内に定義された特殊なメソッドで、オブジェクトが生成されるタイミングで自動的に呼び出されるものです。その主な役割は、オブジェクトの状態やプロパティを初期化することにあります。

PHPでは、__construct という特別な名前を持つメソッドがコンストラクタとして機能します。

基本構文

__construct ([ mixed $args = "" [, $... ]] ) : void

コンストラクタの基本的な例

次の例では、オブジェクトを生成しただけでコンストラクタが自動的に実行されることが確認できます。

サンプルコード

<?php
class myclass{
    function __construct(){
        echo "object initialized";
    }
}
$obj=new myclass();
?>

実行結果

object initialized

new myclass() を呼び出した瞬間に「object initialized」が出力されており、明示的にメソッドを呼ばなくてもコンストラクタが動作していることが分かります。

引数を受け取るコンストラクタ

コンストラクタに引数を渡すことで、オブジェクト生成時にクラスのプロパティへ値を設定できます。

サンプルコード

<?php
class rectangle{
    var $height;
    var $width;
    function __construct($arg1, $arg2){
        $this->height=$arg1;
        $this->width=$arg2;
    }
    function show(){
        echo "Height=$this->height Width=$this->width";
    }
}
$obj=new rectangle(10,20);
$obj->show();
?>

実行結果

Height=10 Width=20

このように、$this-> を使ってプロパティにアクセスし、引数で受け取った値を代入することで、インスタンスごとに異なる初期状態を持たせることができます。

継承時のコンストラクタの挙動

親クラスにコンストラクタが定義されている場合、子クラスのコンストラクタ内から parent::__construct() を呼び出すことで親の処理を実行できます。

一方、子クラス側でコンストラクタを定義していない場合は、親クラスのコンストラクタがそのまま継承されます。

サンプルコード

<?php
class a{
    function __construct(){
        echo "this is a constructor of base class\n";
    }
}
class b extends a{
    function __construct(){
        parent::__construct();
        echo "this a constructor class b\n";
    }
}
class c extends a {
    // コンストラクタ未定義
}
$a=new a();
$b=new b();
$c=new c();
?>

実行結果

this is a constructor of base class
this is a constructor of base class
this a constructor class b
this is a constructor of base class

結果から以下の挙動が読み取れます。

  • クラスa:自身のコンストラクタのみ実行
  • クラスb:parent::__construct() により親のコンストラクタ→子のコンストラクタの順に実行
  • クラスc:コンストラクタを定義していないため、親クラスaのコンストラクタが継承・実行される

デストラクタとは

デストラクタは、ガベージコレクタがあるオブジェクトへの参照がすべてなくなったことを検出した時点で、自動的に呼び出されるメソッドです。PHPでは __destruct という名前で定義します。

また、スクリプト終了時のシャットダウンシーケンスでもオブジェクトは破棄されるため、その際にもデストラクタが実行されます。

デストラクタには以下の特徴があります。

  • 引数を受け取ることができない
  • 戻り値を返すことができない

サンプルコード

<?php
class myclass{
    function __construct(){
        echo "object is initialized\n";
    }
    function __destruct(){
        echo "object is destroyed\n";
    }
}
$obj=new myclass();
?>

実行結果

object is initialized
object is destroyed

オブジェクト生成時にコンストラクタが出力され、スクリプト終了時にデストラクタが呼び出されていることが確認できます。

まとめ

  • コンストラクタ(__construct)はオブジェクト生成時に自動実行され、初期化処理を担う
  • 引数を使えばプロパティの初期値を柔軟に設定できる
  • 継承時は parent::__construct() で親のコンストラクタを明示的に呼び出す必要がある
  • デストラクタ(__destruct)は参照がなくなったときやスクリプト終了時に自動実行される
  1. C#のプライベートコンストラクターとは?シングルトンクラスの実装方法を解説

    プライベートコンストラクターとはC#におけるプライベートコンストラクターは、クラス外部からのインスタンス生成を防ぐために使用される特殊なコンストラクターです。アクセス修飾子がprivateに設定されているため、クラスの外側からは呼び出すことができません。特に、静的(static)メンバーのみを持つクラスでは、インスタンス化する必要がないため、プライベートコンストラクターを定義して誤ってオブジェクトが生成されるのを防ぐのが一般的な手法です。静的メンバーのみのクラスでの使用例以下のように、静的メンバーだけを含むクラスにプライベートコンストラクターを定義できます。class Demo { /

  2. Javaのコンストラクターとは?基本構文から実例までわかりやすく解説

    Javaにおけるコンストラクター(constructor)は、記述方法こそメソッドに似ていますが、いくつかの重要な違いがあります。最大の特徴は、コンストラクター名がクラス名と同一である点と、戻り値の型を持たない点です。コンストラクターは自分で呼び出す必要はありません。オブジェクトを生成(インスタンス化)する際に自動的に実行されます。主な役割は、クラスが持つインスタンス変数の初期化です。コンストラクターの基本構文コンストラクターは以下のように定義します。class ClassName { ClassName() { // 初期化処理 } }コンストラクター定義時の