diff --git a/src/components/Toc.astro b/src/components/Toc.astro index 1345975..aa60ef3 100644 --- a/src/components/Toc.astro +++ b/src/components/Toc.astro @@ -33,7 +33,16 @@ const currentPath = Astro.url.pathname; const sections: Section[] = []; -const sectionPaths = ["html", "js", "cli", "php", "sql", "git", "tips"]; +const sectionPaths = [ + "html", + "js", + "cli", + "php", + "sql", + "git", + "tips", + "reference", +]; for (const path of sectionPaths) { const pages = await getSectionPages(path); diff --git a/src/pages/php/00-introduction.mdx b/src/pages/php/00-introduction.mdx deleted file mode 100644 index 8cef018..0000000 --- a/src/pages/php/00-introduction.mdx +++ /dev/null @@ -1,49 +0,0 @@ ---- -layout: "@/layouts/MarkdownLayout.astro" ---- - -import Toc from "../../components/Toc.astro"; - -export const title = "PHPとWebサーバー"; - -# {title} - -## TOC - -## Webサーバーとは? - -あなたがWebブラウザでWebサイトを閲覧するとき、あなたのコンピュータと「Webサーバー」と呼ばれる別のコンピュータが通信を行っています。 - -Webサーバーはあなたが要求したものを解釈し、適切な情報を送り返す役割を持っています。 -そこ対してなにかページを要求すると、基本的にはそのページのHTMLファイルを送り返します。 - -ところでWebサーバーでは、なにかしらのルールに基づいて送り返す情報を変化させるようにプログラムが組まれていることがあります。 -例えばログイン情報がなければ、本来送り返すHTMLではないものを送り返す判断をすることもあります。 - -このWebサーバー側で動作するプログラムを「サーバーサイドプログラム」や、「バックエンドプログラム」と呼ぶことがあります。 - -## Webサーバーの目的 - -HTMLを表示するだけであれば、HTML、CSS、JavaScriptだけで完結します。 -ではなぜWebサーバーが必要なのでしょうか? - -もちろん不特定多数の人に作成したWebページを公開するためには、Webサーバーが必要です。 -これはわかりやすい目的の一つです。 - -ところでブラウザでWebページを閲覧するとき、あなたはいま表示されているHTMLやJavaScriptのソースコードを直接見ることができます。 -そのページが例えば、クレジットカードを扱うようなページであったとき、その扱いを見ることができてしまうとどうでしょうか? -そこから他人の情報を引用するためのコードが含まれていたらどうでしょうか? - -Webサーバーはこういった、本来見せたくない情報を隠すためにも利用されます。 - -## PHPとは? - -PHPは、主にサーバーサイドプログラムを作成するためのスクリプト言語です。 - -スクリプト言語とは、phpがそのソースコードを1行ずつ解釈しながら実行していく言語のことを指します。 -この特性はプログラムの変更を即座に反映することができます。 -また、なにかエラーが発生するときに、そこまでの行は実行されているために検証がしやすいという利点もあります。 - -PHPは見た目に即時反映されることが学習コストを下げるため、初心者にとって学びやすい言語とされています。 - -このドキュメントでは取り扱っていませんが、`Apache`や`Nginx`といったWebサーバーソフトウェアからPHPを動作させ、処理の結果をWebブラウザに送り返す仕組みが一般的です。 diff --git a/src/pages/php/000-introduction.mdx b/src/pages/php/000-introduction.mdx new file mode 100644 index 0000000..8cef018 --- /dev/null +++ b/src/pages/php/000-introduction.mdx @@ -0,0 +1,49 @@ +--- +layout: "@/layouts/MarkdownLayout.astro" +--- + +import Toc from "../../components/Toc.astro"; + +export const title = "PHPとWebサーバー"; + +# {title} + +## TOC + +## Webサーバーとは? + +あなたがWebブラウザでWebサイトを閲覧するとき、あなたのコンピュータと「Webサーバー」と呼ばれる別のコンピュータが通信を行っています。 + +Webサーバーはあなたが要求したものを解釈し、適切な情報を送り返す役割を持っています。 +そこ対してなにかページを要求すると、基本的にはそのページのHTMLファイルを送り返します。 + +ところでWebサーバーでは、なにかしらのルールに基づいて送り返す情報を変化させるようにプログラムが組まれていることがあります。 +例えばログイン情報がなければ、本来送り返すHTMLではないものを送り返す判断をすることもあります。 + +このWebサーバー側で動作するプログラムを「サーバーサイドプログラム」や、「バックエンドプログラム」と呼ぶことがあります。 + +## Webサーバーの目的 + +HTMLを表示するだけであれば、HTML、CSS、JavaScriptだけで完結します。 +ではなぜWebサーバーが必要なのでしょうか? + +もちろん不特定多数の人に作成したWebページを公開するためには、Webサーバーが必要です。 +これはわかりやすい目的の一つです。 + +ところでブラウザでWebページを閲覧するとき、あなたはいま表示されているHTMLやJavaScriptのソースコードを直接見ることができます。 +そのページが例えば、クレジットカードを扱うようなページであったとき、その扱いを見ることができてしまうとどうでしょうか? +そこから他人の情報を引用するためのコードが含まれていたらどうでしょうか? + +Webサーバーはこういった、本来見せたくない情報を隠すためにも利用されます。 + +## PHPとは? + +PHPは、主にサーバーサイドプログラムを作成するためのスクリプト言語です。 + +スクリプト言語とは、phpがそのソースコードを1行ずつ解釈しながら実行していく言語のことを指します。 +この特性はプログラムの変更を即座に反映することができます。 +また、なにかエラーが発生するときに、そこまでの行は実行されているために検証がしやすいという利点もあります。 + +PHPは見た目に即時反映されることが学習コストを下げるため、初心者にとって学びやすい言語とされています。 + +このドキュメントでは取り扱っていませんが、`Apache`や`Nginx`といったWebサーバーソフトウェアからPHPを動作させ、処理の結果をWebブラウザに送り返す仕組みが一般的です。 diff --git a/src/pages/reference/010-foundation-php.mdx b/src/pages/reference/010-foundation-php.mdx new file mode 100644 index 0000000..209f3a6 --- /dev/null +++ b/src/pages/reference/010-foundation-php.mdx @@ -0,0 +1,371 @@ +--- +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 = << 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の中に埋め込むことができます。 `` タグで囲まれた部分がサーバーで実行され、その出力結果がHTMLに挿入されます。 + +#### GETパラメータを使って動的に表示を変更する + +URLのクエリパラメータ (`?name=...`) を使って、表示する内容を変える例です。 + +```php + + + + Welcome Page + + +

+ Welcome, + + ! +

+ + +``` + +このファイルに `?name=Bob` を付けてアクセスすると、ブラウザには `

Welcome, Bob!

` と表示されます。 + +#### 配列の内容からリストを生成する + +PHPのループ処理を使って、配列からHTMLのリスト (`