Java から PHP に来た人向け
Javaではすべて.
(ドット) で済みますが、PHPには->
(アロー) と::
(スコープ解決) の2種類があります。
元々javaを使用していてphpを最近使用しているので記載しました。
本記事ではこの違いを具体例とともに徹底整理しました!
🟢 1. 概念対比表
概念 | Java | PHP (インスタンス) | PHP (静的) |
---|---|---|---|
フィールド参照 | obj.field |
$obj->field |
Class::$field |
メソッド呼び出し | obj.method() |
$obj->method() |
Class::method() |
定数 |
CONSTANT (static final) |
— | Class::CONSTANT |
名前空間 / パッケージ区切り | com.foo.Bar |
Foo\Bar () |
— |
覚え方:
PHP では インスタンス =->
、クラス =::
と覚えるだけ。
🟢 2. コード例で見る「.」「->」「::」の違い
2‑1. インスタンスメンバー
// Java
User u = new User();
System.out.println(u.name);
u.login();
// PHP
$u = new User();
echo $u->name; // ← ->
$u->login();
2‑2. 静的メンバー / クラス定数
// Java
System.out.println(Math.PI);
int v = Integer.parseInt("123");
// PHP
echo Math::PI; // 定数
$value = Integer::parse("123"); // 静的メソッド
2‑3. self::
, parent::
, static::
(PHP独自)
class Base {
public static function who() { echo "Base"; }
}
class Child extends Base {
public static function who() { echo "Child"; }
public static function call() {
parent::who(); // Base
self::who(); // Child
static::who(); // 遅延静的束縛→ Child
}
}
演算子 | 意味 | 呼ばれるメソッド | 特徴 |
---|---|---|---|
parent:: |
親クラスのメソッドを呼ぶ | 親に定義されたもの | 常に「親」固定 |
self:: |
今定義しているクラスのメソッドを呼ぶ | 自分自身 | 定義時のクラスに固定 |
static:: |
実行時の呼び出し元クラスにあるメソッド | 呼び出した側のクラスにあるもの | 動的に変わる(遅延静的束縛) |
🟢 3. なぜ Java は「.」だけで済むのか?
-
Java: 静的メンバーとインスタンスメンバーを文法的に同じ記法で表現し、型情報で解決します。
ClassName.staticMethod(); // 静的 obj.instanceMethod(); // インスタンス
-
PHP: 実行時バインディングが基本で、静的メンバーとインスタンスメンバーを演算子で区別する必要があります。
→ その結果、->
(アロー) と::
(スコープ解決) が分離されています。
🟢 4. PHP での使い分けルール
使う場面 | 演算子 | 例 | 備考 |
---|---|---|---|
インスタンスのプロパティ / メソッド | -> |
$car->speed / $car->run()
|
オブジェクトが null だとエラー(?-> でnullsafe) |
静的プロパティ / メソッド / 定数 | :: |
Car::$count / Car::maxSpeed() / Car::WHEEL
|
self:: , parent:: , static:: もここ |
名前空間区切り | \ |
App\Http\Controller |
ファイル先頭の namespace / use と併用 |
ワンポイントメモ:
PHP 8.0+ では?->
(nullsafe)が追加されました。例えば:$name = $user?->profile?->name;
🟢 5. よくある落とし穴
ケース | Java | PHP | 解説 |
---|---|---|---|
インスタンスから静的メソッド呼び出し |
obj.staticMethod(); → 警告 |
$obj::staticMethod(); 可能
|
PHP では許されますが非推奨。IDE も警告を出します。 |
プロパティの動的アクセス | リフレクション必須 | $obj->{$prop} |
文字列変数からメンバー名を決定できるのは PHP のみ。 |
連鎖呼び (obj.a.b.c ) |
普通に可能 | $obj->a->b->c |
途中で null がある場合、Java は NPE、PHP は FATAL(PHP 8.0+ なら ?-> )。 |
🟢 6. まとめ
-
インスタンス →
->
/ クラス →::
が PHP の基本形。 - Java の
.
は 両方兼用 ですが、PHP では 実行時解決 の都合で演算子が分けられています。 - 1 行の違いに見えて、依存注入・柔軟性・テスト設計 に直結するため、演算子の意味を正しく理解して使い分けましょう!
🟢 付録:チートシート
PHP
----
$obj->prop // インスタンスプロパティ
$obj->method() // インスタンスメソッド
Class::$prop // 静的プロパティ
Class::method() // 静的メソッド
Class::CONST // クラス定数
self::/parent:: // 同/親クラス参照
static:: // 遅延静的束縛
Java
----
obj.prop // インスタンスプロパティ
obj.method() // インスタンスメソッド
Class.prop // 静的プロパティ
Class.method() // 静的メソッド
Class.CONST // static final 定数