Java経験者がPHPでハマる10選の3「コンストラクタの書き方の違い」

こんにちは。ゆうせいです。

Javaをしっかり学んだ人がPHPに移行すると、「似てるはずなのに全然感覚が違う!」と驚くことが多いんです。
同じオブジェクト指向言語ですが、設計思想や実行環境、型の扱い方などがかなり異なります。
Java経験者がPHPを学ぶときにハマりやすいポイントを10個にまとめ、具体的な解説と回避方法をお伝えしています。

今回は「コンストラクタの書き方の違い」を深掘りします。


コンストラクタの書き方の違い

JavaとPHP、どちらもオブジェクト指向ですが、コンストラクタ(インスタンス生成時に自動で呼ばれる初期化メソッド)の書き方や動き方が微妙に異なります。

Java経験者がPHPに来ると「クラス名でコンストラクタ書いたら動かない…」という戸惑いが起きやすいです。


JavaとPHPのコンストラクタ比較

項目JavaPHP
メソッド名クラス名と同じ__construct(ダブルアンダースコア+construct)
戻り値なし(voidも書かない)なし(型宣言も不可)
呼び出しタイミングnewでインスタンス生成時同じくnewでインスタンス生成時
オーバーロード引数の型や数で複数定義可オーバーロード不可(デフォルト引数で対応)

サンプルコード

Java

public class Sample {
    public Sample() {
        System.out.println("Hello");
    }
}

//呼び出し:

//Sample s = new Sample(); // "Hello"

PHP

class Sample {
    public function __construct() {
        echo "Hello";
    }
}

//呼び出し:

$s = new Sample(); // Hello

よくあるJava脳トラブル

間違ったPHPコード(Java風)

class Sample {
    public function Sample() {
        echo "Hello";
    }
}

$s = new Sample(); // 何も表示されない(PHP8では警告)

古いPHP(5.x以前)ではクラス名=コンストラクタが許されていましたが、現在は非推奨です。


オーバーロードができない問題

Javaでは以下のように引数の数や型で複数のコンストラクタを作れます。

public class User {
    public User(String name) { ... }
    public User(String name, int age) { ... }
}

PHPでは1つしかコンストラクタを持てないため、次のようにデフォルト引数可変長引数で対応します。

class User {
    public function __construct($name, $age = null) {
        if ($age === null) {
            echo "Name only: $name";
        } else {
            echo "Name: $name, Age: $age";
        }
    }
}


継承時の注意

  • PHPで親クラスにコンストラクタがある場合、子クラスは明示的に parent::__construct() を呼ばないと親の初期化処理が動かない
  • Javaは親クラスのデフォルトコンストラクタを自動で呼びます(ただし引数付きは明示的にsuper()必要)

イメージで理解する

  • Javaのコンストラクタ:名前付き玄関。玄関ごとに違う入口(オーバーロード)を作れる
  • PHPのコンストラクタ:統一入口(__construct)しかなく、入り方の違いは玄関の中で振り分ける

実務での推奨

  1. 常に__constructを使う(互換性のため)
  2. 引数の型宣言+デフォルト値で柔軟性を持たせる
  3. 継承する場合はparent::__construct()を忘れない

「Javaは入口複数OK、PHPは入口1つだけ」という構造を理解しましょう。

次の4つ目「配列の概念の違い」に進めれば、オブジェクトとデータ構造の設計思想の差も見えてきます。

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。