---
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を画面に表示します。