Java経験者がPHPでハマる10選の3「コンストラクタの書き方の違い」
こんにちは。ゆうせいです。
Javaをしっかり学んだ人がPHPに移行すると、「似てるはずなのに全然感覚が違う!」と驚くことが多いんです。
同じオブジェクト指向言語ですが、設計思想や実行環境、型の扱い方などがかなり異なります。
Java経験者がPHPを学ぶときにハマりやすいポイントを10個にまとめ、具体的な解説と回避方法をお伝えしています。
今回は「コンストラクタの書き方の違い」を深掘りします。
コンストラクタの書き方の違い
JavaとPHP、どちらもオブジェクト指向ですが、コンストラクタ(インスタンス生成時に自動で呼ばれる初期化メソッド)の書き方や動き方が微妙に異なります。
Java経験者がPHPに来ると「クラス名でコンストラクタ書いたら動かない…」という戸惑いが起きやすいです。
JavaとPHPのコンストラクタ比較
項目 | Java | PHP |
---|---|---|
メソッド名 | クラス名と同じ | __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
)しかなく、入り方の違いは玄関の中で振り分ける
実務での推奨
- 常に
__construct
を使う(互換性のため) - 引数の型宣言+デフォルト値で柔軟性を持たせる
- 継承する場合は
parent::__construct()
を忘れない
「Javaは入口複数OK、PHPは入口1つだけ」という構造を理解しましょう。
次の4つ目「配列の概念の違い」に進めれば、オブジェクトとデータ構造の設計思想の差も見えてきます。
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。
最新の投稿
山崎講師2025年8月12日Java経験者のためのPHP入門
山崎講師2025年8月12日Java経験者がPHPでハマる10選の1 「型のゆるさ(動的型付け)に戸惑う」
山崎講師2025年8月12日Java経験者がPHPでハマる10選の2 「アクセス修飾子のデフォルト挙動の違い」
山崎講師2025年8月12日Java経験者がPHPでハマる10選の3「コンストラクタの書き方の違い」