Java経験者がPHPでハマる10選の9 「名前空間の扱い方」

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

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

次は、9つ目「名前空間の扱い方」を掘り下げます。


名前空間の扱い方

JavaとPHPでは、クラスや関数の重複を避けるための仕組みとして「パッケージ」や「名前空間」がありますが、その考え方と書き方に違いがあります。
Java経験者はPHPの名前空間を見て「なんだか似てるけど、微妙に動きが違う…」と感じるはずです。


JavaとPHPの比較表

項目JavaPHP
キーワードpackagenamespace
宣言位置ファイルの先頭に必須ファイルの先頭に推奨(複数も可だが非推奨)
区切り文字ドット(.バックスラッシュ(\
インポートimportuse
デフォルトjava.langパッケージが常に利用可能グローバル名前空間が常に利用可能
クラス検索パッケージ名+クラス名で一意名前空間+クラス名で一意(ただし関数・定数も対象)

Javaの例

package com.example.app;

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> items = new ArrayList<>();
    }
}

  • パッケージ構造とディレクトリ構造が一致する必要がある

PHPの例

namespace App\Example;

use DateTime;

class Main {
    public function run() {
        $dt = new DateTime();
        echo $dt->format('Y-m-d');
    }
}

  • 名前空間とディレクトリ構造は一致が推奨だが、必須ではない(PSR-4で統一可能)

ハマりポイント1:グローバル名前空間

PHPではnamespaceを書かないクラス・関数・定数は「グローバル名前空間」に属します。
同じ名前空間で別のクラスを定義すると競合します。

class DateTime {} // グローバルのDateTimeと競合

回避するには\DateTimeとバックスラッシュ付きで明示するか、useでインポートします。


ハマりポイント2:関数と定数も対象

Javaはクラスやインターフェイスが対象ですが、PHPの名前空間は関数や定数もスコープに含まれます

namespace MyApp;

function strlen($str) { return 42; }

echo strlen("abc"); // 42(標準のstrlenは呼ばれない)


ハマりポイント3:オートロードとの関係

  • Javaはクラスパスでクラスを探し、自動的にロード
  • PHPはPSR-4準拠でComposerがディレクトリと名前空間をマッピングして読み込む
  • 名前空間とディレクトリ構造がズレているとオートロード失敗

イメージで理解する

  • Javaのパッケージ:きっちり整列した住所(国・県・市)で必ずその場所に存在
  • PHPの名前空間:住所はあるけど、実際の建物(ファイル)は別の場所に置いても動く(ただし混乱の元)

実務での推奨

  1. PSR-4に従い、名前空間=ディレクトリ構造にする
  2. グローバル名前空間を避け、必ず名前空間を宣言
  3. 標準クラスや関数と同名にしない
  4. useを使い、完全修飾名(\App\Foo\Bar)の多用を避ける

次はラスト10つ目「実行環境の違い」です。

JavaとPHPの開発〜デプロイの流れの根本的な違いが整理できます。

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

投稿者プロフィール

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