【Java vs PHP】`.` と `-> / ::` 完全対比表

> **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
// Java
User u = new User();
System.out.println(u.name);
u.login();
```

```php
// PHP
$u = new User();
echo $u->name;   // ← ->
$u->login();
```

### 2‑2. 静的メンバー / クラス定数

```java
// Java
System.out.println(Math.PI);
int v = Integer.parseInt("123");
```

```php
// PHP
echo Math::PI;             // 定数
$value = Integer::parse("123"); // 静的メソッド
```

### 2‑3. `self::`, `parent::`, `static::`（PHP独自）

```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**: 静的メンバーとインスタンスメンバーを文法的に同じ記法で表現し、型情報で解決します。
    ```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）が追加されました。例えば：  
> ```php
> $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 行の違いに見えて、**依存注入・柔軟性・テスト設計** に直結するため、演算子の意味を正しく理解して使い分けましょう！

---

### 🟢 付録：チートシート

```text
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 定数
```