【Java  PHP】構文面での主な違い

### はじめに

今までJavaをメインに使用してきましたが、次の職場でPHPを使用するので記載します。JavaとPHPは、用途や設計思想、実行環境が大きく異なるプログラミング言語です。以下では、特に構文面に着目して、それぞれの主な違いを解説します。

### 1. 言語の基本的な性質

#### Java
- **静的型付け言語**：変数やメソッドの型をコンパイル時に明示的に指定する必要があります。
- **コンパイル言語**：ソースコードはコンパイルしてバイトコードに変換し、JVM上で実行されます。
- **クラスベースのオブジェクト指向言語**：すべてのコードはクラス内に定義されます。

#### PHP
- **動的型付け言語**：変数の型宣言は基本的に不要ですが、PHP7以降は型宣言（スカラー型や戻り値型）も利用可能です。
- **インタプリタ言語**：スクリプトは逐次解釈される形で実行されます。
- **柔軟なスクリプト言語**：クラス外で関数を定義したり、手軽にスクリプトを記述可能です。

### 2. 変数と型宣言

#### Java
- 型の明示が必須

```java
int number = 10;
String text = "Hello, Java!";
```

#### PHP（型なしの通常の書き方）

- PHP では「変数宣言」という文がなく、$変数名 = 値 と書くと代入と同時に変数が有効になります。
- 基本的には型宣言も不要ですが、PHP 7 以降では関数引数やクラスプロパティで任意に型を指定できます。

```php
<?php
$number = 10;   // これは「変数を宣言」ではなく「変数に値を代入」して初期化する書き方
$text = "Hello, PHP!";
?>
```
- なお、グローバルスコープの変数を関数内で使用したい場合は global $変数名 と書く必要があります。
- これは「他のスコープの変数を持ってくる」ことを明示するためで、PHP はスコープを跨いだ変数共有を厳密に制御する仕様になっています。

#### PHP（型ありバージョン）

PHP 7.4以降ではクラスのプロパティに型を指定できるようになりました。PHP 7以降では関数の引数・戻り値の型を指定できます。

```php
<?php
declare(strict_types=1); // 厳密な型チェックを有効化

class User {
    public int $id;       // クラスプロパティに型指定
    public string $name;  // 文字列型

    public function __construct(int $id, string $name) {
        $this->id = $id;
        $this->name = $name;
    }

    public function greet(): string { // 戻り値の型指定
        return "Hello, " . $this->name;
    }
}

$user = new User(1, "Alice");
echo $user->greet(); // Hello, Alice
?>
```

### 3. 関数・メソッドの定義方法

#### Java
- クラス内にメソッドを定義する

```java
public class Main {
    public static void main(String[] args) {
        System.out.println("Hello, Java!");
    }
    
    public int add(int a, int b) {
        return a + b;
    }
}
```

#### PHP（型なし）
- クラス外にも関数を定義できる

```php
<?php
function add($a, $b) {
    return $a + $b;
}
echo add(3, 4);
?>
```

#### PHP（型あり）
- 関数の引数・戻り値に型を指定

```php
<?php
declare(strict_types=1);

function add(int $a, int $b): int {
    return $a + $b;
}

echo add(3, 4); // 7
?>
```

### 4. クラスとオブジェクト

#### Java
- すべてがクラス内に定義されるため、オブジェクト指向の設計が基本

```java
public class Person {
    private String name;
    
    public Person(String name) {
        this.name = name;
    }
    
    public void greet() {
        System.out.println("Hello, " + name);
    }
}
```

#### PHP（型あり）
- PHP 7.4以降ではクラスのプロパティにも型を指定可能

```php
<?php
class Person {
    private string $name;

    public function __construct(string $name) {
        $this->name = $name;
    }

    public function greet(): string {
        return "Hello, " . $this->name;
    }
}

$person = new Person("PHP");
echo $person->greet();
?>
```

### 5. 例外処理

#### Java
- try-catch-finally構文を用いて厳密に例外を管理

```java
try {
    // 例外が発生する可能性のあるコード
} catch (IOException e) {
    // 例外処理
} finally {
    // 後処理
}
```

#### PHP（型あり）
- PHP 7以降では例外の型も指定可能

```php
<?php
function divide(int $a, int $b): float {
    if ($b === 0) {
        throw new InvalidArgumentException("Division by zero");
    }
    return $a / $b;
}

try {
    echo divide(10, 2);
} catch (InvalidArgumentException $e) {
    echo $e->getMessage();
}
?>
```

### 6. PHP 8のユニオン型（複数の型を許容）

PHP 8.0 からは ユニオン型 が導入され、関数の引数や戻り値に 複数の型 を指定できるようになりました。

```php
<?php
function formatData(int|string $data): string {
    return "Data: " . $data;
}

echo formatData(100);   // "Data: 100"
echo formatData("Test"); // "Data: Test"
?>
```

### 7. まとめ

JavaとPHPは、用途や設計思想、実行環境が大きく異なります。
- **Java** は厳密な型付けとクラスベースの設計が特徴で、大規模システムやエンタープライズ向けのアプリケーションに適しています。
- **PHP** は動的なスクリプト言語としてWeb開発に柔軟に対応し、短いコードで素早く開発できる点が魅力です。

PHP 7以降では型を指定できるようになったため、クラスのプロパティや関数の引数・戻り値では型を指定したほうがバグを減らせるでしょう。一方で、PHPは動的な型付けを活かした柔軟なコーディングも可能なので、用途に応じて型の有無を使い分けるのがベストです。


✅ 関数の引数・戻り値、クラスプロパティには型を指定したほうが良い  
❌ 一時的な変数や動的なデータには型を指定しなくてもOK