Java経験者がPHPでハマる10選の2 「アクセス修飾子のデフォルト挙動の違い」

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

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

今回は「アクセス修飾子のデフォルト挙動の違い」を掘り下げます。


アクセス修飾子のデフォルト挙動の違い

Java経験者がPHPを書くときに意外とハマるのが、アクセス修飾子を省略したときのデフォルトが全く違うという点です。

Javaは「修飾子なし=パッケージプライベート」ですが、PHPは「修飾子なし=public」になります。
この差を知らずに書くと、本来外部から触ってほしくないメソッドやプロパティが、誰でもアクセス可能な状態になるという危険があります。


JavaとPHPの比較表

修飾子Javaの意味PHPの意味
publicどこからでもアクセス可能どこからでもアクセス可能
protected同一クラス+サブクラス+同一パッケージ(Java 17以前)同一クラス+サブクラス
private同一クラス内のみ同一クラス内のみ
(省略時)パッケージプライベート(同一パッケージ内からのみ)public扱い(どこからでもアクセス可能)

サンプルコードで確認

Java

public class Sample {
    void hello() { // パッケージプライベート
        System.out.println("Hello");
    }
}

同一パッケージなら呼び出せるが、別パッケージからはアクセス不可。


PHP

class Sample {
    function hello() { // public 扱い
        echo "Hello";
    }
}

$obj = new Sample();
$obj->hello(); // 呼び出し可能

修飾子を書かなかっただけで、外部からアクセスできてしまう。


これが危険な理由

  • 意図しない外部アクセスが可能になり、セキュリティホールの原因になる
  • 内部用メソッドが勝手に使われ、仕様変更時に外部コードが壊れる可能性が高まる
  • APIやライブラリ公開時に予期しない仕様公開になってしまう

回避策

  1. 必ず修飾子を明示する習慣を持つ
class User {
    private $password;
    protected $email;
    public function getEmail() {
        return $this->email;
    }
}
  1. チームコーディング規約に組み込む
  • 「修飾子なしの関数定義は禁止」ルールを導入する
  • 静的解析ツール(PHPStan, Psalm)で検出する

イメージで理解する

  • Javaの修飾子なし:マンションのオートロック(同じ住人だけ入れる)
  • PHPの修飾子なし:玄関ドア全開(通りすがりでも入れる)

この違いを理解していないと、「Javaでは守られていたのに、PHPでは丸裸」という状況になりかねません。
特にクラス設計をオブジェクト指向らしく保ちたいなら、修飾子の明示は必須です。


次は3つ目「コンストラクタの書き方の違い」に進めます。

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

投稿者プロフィール

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