Newer
Older
hello-programmer-world / src / pages / reference / 010-foundation-php.mdx
---
layout: "@/layouts/MarkdownLayout.astro"
---

export const title = "型と基本構文 (PHP)";

# {title}

## TOC

## 型

PHPの型は、大きく分けて「スカラー型」「複合型」「特殊型」の3つに分類されます。

### スカラー型 (Scalar Types)

単一の値を表す型です。

#### 整数型 (int)

```php
var_dump(123);   // int(123)
var_dump(-123);  // int(-123)

var_dump(0x1A);  // int(26)  // 16進数
var_dump(0b0101); // int(5)    // 2進数
var_dump(0o755);  // int(493)   // 8進数
```

#### 浮動小数点数型 (float)

```php
var_dump(3.14); // float(3.14)
```

#### 論理型 (bool)

```php
var_dump(true);  // bool(true)
var_dump(false); // bool(false)
```

#### 文字列型 (string)

シングルクォート (`'`) またはダブルクォート (`"`) で囲みます。  
ダブルクォート内では変数を展開できます。

```php
var_dump("Hello, World!"); // string(13) "Hello, World!"
var_dump('PHP');           // string(3) "PHP"

$name = "Alice";
echo "Hello, $name!"; // Hello, Alice!
echo 'Hello, $name!'; // Hello, $name!
```

`heredoc` や `nowdoc` を使って、複数行の文字列を記述することもできます。

```php
$multiLine = <<<EOT
これは
複数行の
文字列です。
EOT;
var_dump($multiLine);
```

### 複合型 (Compound Types)

複数の値をまとめることができる型です。

#### 配列 (array)

PHPの配列は、数値の添字を持つ配列と、文字列のキーを持つ連想配列の両方を扱うことができます。

```php
// 数値の添字を持つ配列
$list = [1, 2, 3, 4, 5];
print_r($list);
// Array
// (
//     [0] => 1
//     [1] => 2
//     [2] => 3
//     [3] => 4
//     [4] => 5
// )

// 連想配列
$assoc = [
  "name" => "Charlie",
  "age" => 28
];
print_r($assoc);
// Array
// (
//     [name] => Charlie
//     [age] => 28
// )
echo $assoc["name"]; // "Charlie"
```

#### オブジェクト (object)

`class` を使って独自の型を定義し、そのインスタンスとしてオブジェクトを作成します。  
`public`, `protected`, `private` といったアクセス修飾子で、プロパティやメソッドへのアクセスを制御できます。

```php
class Person {
  // public: どこからでもアクセス可能
  public string $name;
  // private: このクラス内からのみアクセス可能
  private int $age;

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

  public function greet(): void {
    echo "Hello, my name is {$this->name} and I am {$this->age} years old.";
  }
}

$alice = new Person("Alice", 30);
var_dump($alice); // object(Person)#1 (2) { ["name"]=> string(5) "Alice" ["age":protected]=> int(30) }
echo $alice->name; // "Alice"
$alice->greet(); // "Hello, my name is Alice and I am 30 years old."
```

### 特殊型

#### NULL

`null`は、変数が値を持たないことを表す特別な値です。

```php
$emptyValue = null;
var_dump($emptyValue); // NULL
```

## 関数

`function` キーワードで関数を宣言します。  
PHP 7.4からは、より簡潔なアロー関数も使用できます。

```php
// 通常の関数宣言
function add($a, $b) {
  return $a + $b;
}

// アロー関数
$sub = fn($a, $b) => $a - b;
```

引数と戻り値に型を指定することができます(型宣言)。

```php
// PHP 8.0からは、複数の型を返すことを示す `Union Types` が使えます
function getValue(bool $flag): int|string {
  if ($flag) {
    return 42;
  } else {
    return "Hello";
  }
}
```

## コメント行

PHPでは、以下の3つの方法でコメントを記述できます。

```php
// これは1行コメントです。

# これもCGIシェル形式の1行コメントです。

/*
これは複数行に
渡るコメントです。
*/

$value = 100;

/**
 * これはPHPDoc (ドキュメンテーションコメント) です。
 * @param string $name 挨拶する相手の名前
 * @return void
 */
function greet(string $name): void {
  // 挨拶を表示する
  echo "Hello, " . $name . "!";
}
```

## 標準出力

PHPのコードがサーバーで実行された結果は、通常HTMLとしてブラウザに送信されます。
CLI (コマンドライン) 環境で実行した場合は、コンソールに出力されます。

`echo` や `print` が最も一般的に使われます。

```php
echo "Hello, World!";
print "This also works.";

// echoは複数の引数を取ることができます
echo "Hello", " ", "World!";
```

変数の内容をデバッグ目的で確認するには `print_r` や `var_dump` が便利です。

```php
$myArray = ["name" => "Alice", "age" => 30];

// 人間が読みやすい形式で出力
print_r($myArray);
// Array
// (
//     [name] => Alice
//     [age] => 30
// )

// 型情報を含む、より詳細な情報を出力
var_dump($myArray);
// array(2) {
//   ["name"]=>
//   string(5) "Alice"
//   ["age"]=>
//   int(30)
// }
```

## 変数

### スーパーグローバル変数

PHPには、スクリプトのどこからでも常にアクセスできる、多くの定義済み変数があります。これらを「スーパーグローバル変数」と呼びます。  
ブラウザからのリクエスト情報などが格納されています。

- `$_GET`: GETリクエストで渡されたデータが格納された連想配列。
- `$_POST`: POSTリクエストで渡されたデータが格納された連想配列。
- `$_SERVER`: サーバーや実行環境の情報が格納された連想配列。
- `$_SESSION`: セッション変数を格納した連想配列。
- `$_COOKIE`: HTTPクッキーの値を格納した連想配列。

```php
// URLが /index.php?name=Alice の場合
echo $_GET['name']; // "Alice"

// フォームから送信された値
echo $_POST['username'];
```

### 変数の宣言

PHPの変数は `$` で始まり、代入によって宣言されます。`var` や `const` のようなキーワードは不要です。

```php
$name = "Bob";
$age = 25;
```

再代入できない定数を定義するには `const` または `define()` を使います。

```php
// クラス定数や、スクリプトのトップレベルで利用可能
const APP_VERSION = "1.0.0";

// スクリプトのどこでも定義可能
define("LEGACY_CONSTANT", "some_value");
```

## HTMLの生成 (HTMLとの連携)

PHPはサーバーサイド言語であり、JavaScriptのようにブラウザ上で直接HTML要素を操作するわけではありません。  
PHPの主な役割は、**動的にHTMLを生成してブラウザに送信すること**です。

PHPコードはHTMLの中に埋め込むことができます。 `<?php ... ?>` タグで囲まれた部分がサーバーで実行され、その出力結果がHTMLに挿入されます。

#### GETパラメータを使って動的に表示を変更する

URLのクエリパラメータ (`?name=...`) を使って、表示する内容を変える例です。

```php
<!DOCTYPE html>
<html>
<head>
    <title>Welcome Page</title>
</head>
<body>
    <h1>
      Welcome,
      <?php
        // $_GET['name'] が存在すればその値を、なければ 'Guest' を表示
        // htmlspecialchars() はセキュリティ対策 (XSS防止) のために重要
        echo htmlspecialchars($_GET['name'] ?? 'Guest');
      ?>
      !
    </h1>
</body>
</html>
```

このファイルに `?name=Bob` を付けてアクセスすると、ブラウザには `<h1>Welcome, Bob!</h1>` と表示されます。

#### 配列の内容からリストを生成する

PHPのループ処理を使って、配列からHTMLのリスト (`<ul>`, `<li>`) を生成する例です。

```php
<?php
  $fruits = ["Apple", "Banana", "Cherry"];
?>
<!DOCTYPE html>
<html>
<body>
    <ul>
        <?php foreach ($fruits as $fruit): ?>
            <li><?php echo $fruit; ?></li>
        <?php endforeach; ?>
    </ul>
</body>
</html>
```

## イベント (リクエストの処理)

JavaScriptの `click` イベントのような仕組みは、ブラウザ(クライアントサイド)の機能です。  
PHP(サーバーサイド)における「イベント」とは、ブラウザからの**リクエスト**(ページの表示要求、フォームの送信など)を受け取ることと考えることができます。

ユーザーがフォームを送信すると、ブラウザはPHPスクリプトに対して新しいリクエストを送信します。PHPはそのリクエストを受け取り、内容を処理して、結果をHTMLとして返却します。

#### フォームの送信を処理する

`form.html`
```html
<form action="process.php" method="post">
    <label for="username">Name:</label>
    <input type="text" id="username" name="username">
    <button type="submit">Submit</button>
</form>
```

`process.php`
```php
<!DOCTYPE html>
<html>
<head>
    <title>Process Form</title>
</head>
<body>
    <?php
    // リクエストがPOSTメソッドの場合のみ処理
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        $username = $_POST['username'] ?? 'N/A';
        echo "<h2>Hello, " . htmlspecialchars($username) . "!</h2>";
    } else {
        echo "<p>Please submit the form.</p>";
    }
    ?>
</body>
</html>
```

1.  ユーザーが `form.html` を表示し、名前を入力して送信します。
2.  ブラウザは `process.php` に対し、入力されたデータを含んだPOSTリクエストを送信します。
3.  サーバーは `process.php` を実行します。
4.  `process.php` はPOSTリクエストから `username` を受け取り、「Hello, (ユーザー名)!」という内容のHTMLを生成してブラウザに返します。
5.  ブラウザは、そのHTMLを画面に表示します。