diff --git a/install/fpm/index.xml b/install/fpm/index.xml
index 5ca179d681..581b3f757e 100644
--- a/install/fpm/index.xml
+++ b/install/fpm/index.xml
@@ -1,6 +1,6 @@
-
+
FastCGI Process Manager (FPM)
&fpm.intro;
@@ -43,10 +43,10 @@
-
+
fastcgi_finish_request - 何か時間のかかる処理 (動画の変換や統計情報の処理など) を継続しながら
リクエストを終了させてすべてのデータを出力させるための特殊な関数
-
+
@@ -67,6 +67,18 @@
+
+
+ 信頼できないネットワークから php-fpm に到達できるようにしてはいけません。
+ FastCGI 接続を確立できるクライアントは、そのリクエストで使われる設定を
+ auto_prepend_file も含めて制御できるので、
+ 任意のコードを実行できます。
+ アクセスの制限は、
+ listen ディレクティブと
+ listen.allowed_clients ディレクティブで行います。
+
+
+
&install.fpm.install;
&install.fpm.configuration;
diff --git a/install/unix/alpine.xml b/install/unix/alpine.xml
new file mode 100644
index 0000000000..97b32994e8
--- /dev/null
+++ b/install/unix/alpine.xml
@@ -0,0 +1,113 @@
+
+
+
+
+ Alpine Linux でのパッケージからのインストール
+
+ PHP はソースコードからインストールできますが、apk
+ パッケージマネージャを使う Alpine Linux とその派生ディストリビューションでは、
+ パッケージからインストールすることもできます。
+
+ &warn.install.third-party-support;
+
+ パッケージは apk パッケージマネージャでインストールできます。
+
+
+ パッケージのインストール
+
+ Alpine Linux の PHP パッケージは、名前にメジャーバージョン番号を含みます
+ (例: PHP 8.3 なら php83)。以下の例では、83
+ を、お使いの Alpine Linux のリリースで利用できる PHP のバージョンに読み替えてください。
+
+
+ パッケージをインストールする前に、apk update を実行して、
+ パッケージインデックスが最新であることを確認してください。
+
+
+ Alpine インストールの例
+
+
+
+
+
+ Alpine は、Web サーバー用の PHP の設定を自動的には行いません。
+ FastCGI 構成の場合は、php83-fpm をインストールし、
+ OpenRC サービス php-fpm83 を有効にします
+ (パッケージ名とサービス名とで、バージョン番号の付く位置が異なる点に注意してください)。
+ たとえば、次のようにします。
+
+
+ PHP-FPM の有効化と起動
+
+
+
+
+
+
+ 設定のよりよい管理方法
+
+ ベースパッケージでインストールされるのは、コアの拡張モジュールだけです。
+ 追加の拡張モジュール、たとえば
+
+ MySQL
+ cURL
+ GD
+ など
+
+ は、個別のパッケージとしてインストールできます。
+
+
+ 利用可能な PHP パッケージを検索する
+
+
+
+
+
+ パッケージの一覧には、CLI や FPM のほか、多くの拡張モジュールが含まれています。
+ 拡張モジュールをインストールすると、その依存関係は自動的に解決されます。
+
+
+ PHP と MySQL、GD のインストール
+
+
+
+
+
+ 拡張モジュールはインストール時に自動的に有効になるので、&php.ini;
+ を手動で編集する必要はありません。設定ファイルは
+ /etc/php83/conf.d/ に置かれます。
+ 新しい拡張モジュールをインストールしたあとは、変更を反映するために PHP-FPM
+ (もしくは Web サーバー) を再起動する必要があります。
+
+
+
+
diff --git a/install/unix/index.xml b/install/unix/index.xml
index 1a5bd97071..1b079a88aa 100644
--- a/install/unix/index.xml
+++ b/install/unix/index.xml
@@ -1,6 +1,6 @@
-
+
Unix システムへのインストール
@@ -27,6 +27,8 @@
&install.unix.debian;
&install.unix.dnf;
+ &install.unix.alpine;
+ &install.unix.pacman;
&install.unix.openbsd;
&install.unix.source;
diff --git a/install/unix/pacman.xml b/install/unix/pacman.xml
new file mode 100644
index 0000000000..800c53330c
--- /dev/null
+++ b/install/unix/pacman.xml
@@ -0,0 +1,111 @@
+
+
+
+
+ Arch Linux でのパッケージからのインストール
+
+ PHP はソースコードからインストールできますが、pacman を使用する Arch Linux
+ やその派生ディストリビューションでは、パッケージからインストールすることもできます。
+
+ &warn.install.third-party-support;
+
+ パッケージは pacman コマンドでインストールできます。
+
+
+ パッケージのインストール
+
+ まず、Apache には
+ php-apache、FastCGI 構成には php-fpm
+ など、他の関連パッケージが必要になる場合があることに気をつけてください。
+
+
+ パッケージをインストールする前に、システムを最新の状態にしておくことをお勧めします。
+ 通常、これは pacman -Syu コマンドを実行して行います。
+
+
+ Apache と組み合わせる pacman インストールの例
+
+
+
+
+
+ pacman は PHP の依存パッケージをすべて自動的にインストールします。
+ 変更を有効にするには、Web サーバーの再起動が必要になる場合があります。
+ たとえば、次のようにします。
+
+
+ PHP のインストール後に Apache を再起動する
+
+
+
+
+
+
+ 設定のよりよい管理方法
+
+ ここまでのセクションでは、PHP のコアモジュールだけをインストールしました。
+ おそらく、次のような追加モジュールもインストールしたくなることでしょう。
+
+ MySQL
+ cURL
+ GD
+ など
+
+ これらも pacman コマンドでインストールできます。
+
+
+ 追加の PHP パッケージを一覧する方法
+
+
+
+
+
+ パッケージのリストには、php-gd、php-intl、
+ php-sqlite などの PHP 拡張モジュールを含む数多くのパッケージが含まれています。
+ 拡張モジュールがインストールされると、それらのパッケージの依存関係を満たすために、
+ 必要に応じて追加のパッケージが自動的にインストールされます。
+
+
+ PHP と GD のインストール
+
+
+
+
+
+ 拡張モジュールのパッケージをインストールした後、それを有効にするには
+ /etc/php/php.ini 内の対応するエントリのコメントを解除しなければなりません。
+ たとえば php-gd をインストールした後は、
+ /etc/php/php.ini の extension=gd
+ の行のコメントを解除します。これらの変更を有効にするには、Web サーバー (Apache など)
+ の再起動が必要です。
+
+
+
+
diff --git a/reference/datetime/dateinterval.xml b/reference/datetime/dateinterval.xml
index 6a79dbbf6b..1afc7fa0df 100644
--- a/reference/datetime/dateinterval.xml
+++ b/reference/datetime/dateinterval.xml
@@ -1,6 +1,6 @@
-
+
@@ -31,6 +31,21 @@
2つの date/time オブジェクトの差分を
DateTimeInterface::diff 経由で計算することです。
+
+ 間隔を date/time オブジェクトに加算あるいは減算するとき、
+ 間隔の時刻部分 (時、分、秒、マイクロ秒) がどう適用されるかは、
+ その間隔がどうやって作られたかによって決まります。
+ DateInterval::__construct
+ で作られた間隔の場合、時刻部分は経過時間を表します。
+ 一方、DateInterval::createFromDateString
+ で作られた間隔や DateTimeInterface::diff
+ が返した間隔の場合は、時刻部分が個々のコンポーネントの値をインクリメント/デクリメントします。
+ 日付部分 (年、月、日) は、常に個々のコンポーネントの値をインクリメント/デクリメントします。
+ したがって、両者の結果が異なるのは、
+ 間隔の時刻部分がタイムゾーンの遷移をまたぐ場合だけです。
+ 日付/時刻 の算術
+ を参照ください。
+
日付の間隔を比較する良い方法は定義されていません。
よって、DateInterval
diff --git a/reference/datetime/dateinterval/createfromdatestring.xml b/reference/datetime/dateinterval/createfromdatestring.xml
index fbeb2eb1b5..d076c02cf3 100644
--- a/reference/datetime/dateinterval/createfromdatestring.xml
+++ b/reference/datetime/dateinterval/createfromdatestring.xml
@@ -1,6 +1,6 @@
-
+
@@ -30,29 +30,27 @@
&reftitle.parameters;
-
-
-
- datetime
-
-
- 相対部分を含む日付。
- 特に、strtotime や
- DateTimeImmutable、
- DateTime が使うパーサーがサポートする
- 相対書式
- を使って DateInterval を作ることができます。
-
-
- P7D のような ISO-8601
- フォーマットの文字列を使うには、
- DateInterval::__construct
- を使わなければいけません。
-
-
-
-
-
+
+
+ datetime
+
+
+ 相対部分を含む日付。
+ 特に、strtotime や
+ DateTimeImmutable、
+ DateTime が使うパーサーがサポートする
+ 相対書式
+ を使って DateInterval を作ることができます。
+
+
+ P7D のような ISO-8601
+ フォーマットの文字列を使うには、
+ DateInterval::__construct
+ を使わなければいけません。
+
+
+
+
@@ -121,13 +119,12 @@
&reftitle.examples;
-
-
- 日付の間隔のパース
-
+
+ 日付の間隔のパース
+
-
-
-
-
-
- 間隔の組み合わせと、負の間隔のパース
-
+
+
+
+
+ セットになっている間隔のうち、P1DT12H と
+ 1 day + 12 hours のように時刻部分を持つものは、
+ date/time オブジェクトに足すときに、
+ その時刻部分にタイムゾーンの遷移が含まれる場合は、同じ結果になりません。
+ DateInterval::__construct
+ で作った間隔の時刻部分は経過時間を表しますが、
+ このメソッドで作った間隔の時刻部分は、
+ 個々のコンポーネントの値をインクリメント/デクリメントするからです。
+ 日付/時刻 の算術
+ を参照ください。
+
+
+
+ 間隔の組み合わせと、負の間隔のパース
+
format('%d %h %i'), "\n";
$i = DateInterval::createFromDateString('1 year - 10 days');
echo $i->format('%y %d'), "\n";
]]>
-
- &example.outputs;
-
+
+ &example.outputs;
+
-
-
-
-
-
- 特別な相対書式の間隔をパースする
-
+
+
+
+ 特別な相対書式の間隔をパースする
+
-
- &example.outputs.82;
-
+
+ &example.outputs.82;
+
@@ -203,9 +210,9 @@ object(DateInterval)#2 (2) {
string(12) "last weekday"
}
]]>
-
- &example.outputs.8.similar;
-
+
+ &example.outputs.8.similar;
+
@@ -276,9 +283,8 @@ object(DateInterval)#2 (16) {
int(1)
}
]]>
-
-
-
+
+
diff --git a/reference/datetime/datetimeimmutable/add.xml b/reference/datetime/datetimeimmutable/add.xml
index 5e668e0fee..2c4f80ac90 100644
--- a/reference/datetime/datetimeimmutable/add.xml
+++ b/reference/datetime/datetimeimmutable/add.xml
@@ -1,6 +1,6 @@
-
+
@@ -119,6 +119,7 @@ echo $newDate2->format('Y-m-d') . "\n";
DateTimeImmutable::sub
DateTimeImmutable::diff
DateTimeImmutable::modify
+ 日付/時刻 の算術
diff --git a/reference/datetime/datetimeimmutable/sub.xml b/reference/datetime/datetimeimmutable/sub.xml
index 6210628966..c1416f7a06 100644
--- a/reference/datetime/datetimeimmutable/sub.xml
+++ b/reference/datetime/datetimeimmutable/sub.xml
@@ -1,6 +1,6 @@
-
+
@@ -157,6 +157,7 @@ echo $newDate2->format('Y-m-d') . "\n";
DateTimeImmutable::add
DateTimeImmutable::diff
DateTimeImmutable::modify
+ 日付/時刻 の算術
diff --git a/reference/datetime/datetimeinterface/serialize.xml b/reference/datetime/datetimeinterface/serialize.xml
index 599e4a06b6..4aa5748fdf 100644
--- a/reference/datetime/datetimeinterface/serialize.xml
+++ b/reference/datetime/datetimeinterface/serialize.xml
@@ -1,6 +1,6 @@
-
+
DateTime::__serialize
@@ -44,23 +44,50 @@
&reftitle.examples;
- DateTime::serialize の例
+ DateTime::__serialize の例
$this->format(DateTimeInterface::W3C),
+ 'timestamp' => $this->getTimestamp(),
+ 'timezone' => $this->getTimeZone()->getName(),
+ 'to' => 'Drink a cup of coffee',
+ ];
+ }
+}
+
+$date = new CustomDateTimeImmutable('2025-03-27');
var_dump(serialize($date));
]]>
&example.outputs;
+
+ &reftitle.notes;
+
+
+ __serialize() が定義されているのに
+ __unserialize() が定義されていない場合、
+ カスタムの DateTime オブジェクトをアンシリアライズしようとすると
+ Error がスローされます。
+
+
+
+
&reftitle.seealso;
diff --git a/reference/datetime/datetimeinterface/unserialize.xml b/reference/datetime/datetimeinterface/unserialize.xml
index 7181852f62..f8d2c6d361 100644
--- a/reference/datetime/datetimeinterface/unserialize.xml
+++ b/reference/datetime/datetimeinterface/unserialize.xml
@@ -1,6 +1,6 @@
-
+
DateTime::__unserialize
@@ -44,38 +44,66 @@
&reftitle.returnvalues;
-
- DateTime オブジェクトを返します。
-
+
+ &return.void;
+
&reftitle.examples;
- DateTime::unserialize の例
+ DateTime::__unserialize の例
&example.outputs;
string(26) "2025-03-27 00:00:00.000000"
["timezone_type"]=>
- int(3)
+ int(1)
["timezone"]=>
- string(3) "UTC"
+ string(6) "+00:00"
}
]]>
+
+ &reftitle.notes;
+
+
+ __serialize() が定義されているのに
+ __unserialize() が定義されていない
+ カスタムの DateTime オブジェクトをアンシリアライズしようとすると、
+ Error がスローされます。
+
+
+
+
&reftitle.seealso;
diff --git a/reference/datetime/examples.xml b/reference/datetime/examples.xml
index a0f33cbd7e..360037f252 100644
--- a/reference/datetime/examples.xml
+++ b/reference/datetime/examples.xml
@@ -1,6 +1,6 @@
-
+
&reftitle.examples;
@@ -11,14 +11,13 @@
以下の例は、DST(夏時間) への移行や、
異なった日を持つ月に関する 日付/時刻 の算術の罠をいくつか紹介します。
-
-
- DateTimeImmutable::add/sub は、経過時間を含む区間を足してしまう
-
- DST (夏時間) への移行タイミングをまたいで 24時間を足してしまうと、
- (ほとんどのタイムゾーンでは) 23/25時間を足しているように見える
-
-
+
+ DateTimeImmutable::add/sub は、経過時間を含む間隔を加算する
+
+ DST (夏時間) への移行タイミングをまたいで PT24H を足すと、
+ (ほとんどのタイムゾーンでは) 23/25時間を足しているように見える
+
+
format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->add(new DateInterval("PT3H"));
echo "End: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
]]>
-
- &example.outputs;
-
+
+ &example.outputs;
+
-
-
-
-
-
- DateTimeImmutable::modify と strtotime を使い、個々のコンポーネントの値をインクリメント/デクリメントする
-
- DST (夏時間) の移行のタイミングをまたいで24時間を足すと、日付/時刻 文字列に正確に24時間足されることになります
- (開始時刻と終了時刻が同じ移行ポイントにない場合)
- point).
-
-
+
+
+
+ DateTimeImmutable::modify と strtotime を使い、個々のコンポーネントの値をインクリメント/デクリメントする
+
+ DST (夏時間) の移行のタイミングをまたいで24時間を足すと、日付/時刻 文字列に正確に24時間足されることになります
+ (開始時刻または終了時刻が移行ポイント上にある場合を除く)。
+
+
format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("+24 hours");
echo "End: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
]]>
-
- &example.outputs;
-
+
+ &example.outputs;
+
-
-
-
-
-
- 時刻を引き算すると、日付がオーバー/アンダーフローする可能性がある
-
- 1月31日 + 1ヶ月 のような計算をすると、(うるう年のときは) 3月2日、
- または (通常の年は) 3月3日になります。
-
-
+
+
+
+ DateInterval::createFromDateString は、コンポーネントの値をインクリメント/デクリメントする間隔を作る
+
+ DateInterval::createFromDateString は 日付/時刻 パーサーを使います。
+ 作成された間隔の時刻部分は、個々のコンポーネントの値をインクリメント/デクリメントします。
+ 一方、DateInterval::__construct で作成した間隔の場合、
+ 時刻部分は経過時間を表します。そのため、その時刻部分にタイムゾーンの遷移が含まれる場合、
+ 両者は同じ結果になりません。
+ 日付部分はどちらも同じように適用されるので、P1D と
+ 1 day は常に同じ結果になります。
+
+
+format("Y-m-d H:i:s P"), PHP_EOL;
+echo "PT24H: ", $dt->add(new DateInterval("PT24H"))->format("Y-m-d H:i:s P"), PHP_EOL;
+echo "24 hours: ", $dt->add(DateInterval::createFromDateString("24 hours"))->format("Y-m-d H:i:s P"), PHP_EOL;
+]]>
+
+ &example.outputs;
+
+
+
+
+
+ 時刻の加減算で、日付がオーバーフロー/アンダーフローする可能性がある
+
+ 1月31日 + 1ヶ月 のような計算をすると、(うるう年のときは) 3月2日、
+ または (通常の年は) 3月3日になります。
+
+
format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("+1 month");
echo "End: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
]]>
-
- &example.outputs;
-
+
+ &example.outputs;
+
-
-
- 次の月の最後の日を得るために(つまり、オーバーフローを避けるため)、
- last day of フォーマットも利用できます。
-
-
+
+
+ 次の月の最後の日を得るために(つまり、オーバーフローを避けるため)、
+ last day of フォーマットも利用できます。
+
+
format("Y-m-d H:i:s P"), PHP_EOL;
$dt = $dt->modify("last day of next month");
echo "End: ", $dt->format("Y-m-d H:i:s P"), PHP_EOL;
]]>
-
- &example.outputs;
-
+
+ &example.outputs;
+
-
-
-
+
+
diff --git a/reference/errorfunc/functions/restore-error-handler.xml b/reference/errorfunc/functions/restore-error-handler.xml
index da705c1b6b..b4f9bec8c1 100644
--- a/reference/errorfunc/functions/restore-error-handler.xml
+++ b/reference/errorfunc/functions/restore-error-handler.xml
@@ -1,6 +1,6 @@
-
+
@@ -14,11 +14,17 @@
truerestore_error_handler
-
- set_error_handler を使用してエラーハンドラ関数を
- 変更した後、元のエラーハンドラ(組込またはユーザー定義関数)に戻すために
- 使用されます。
-
+
+ 直近の set_error_handler の呼び出しの前に有効だった
+ エラーハンドラを、エラーハンドラの内部スタックから取り出し、
+ 登録時の error_levels マスクとともに再び有効にします。
+ 回復されるハンドラは、組み込みのエラーハンドラかもしれませんし、
+ ユーザー定義関数かもしれません。
+
+
+ この関数を set_error_handler よりも多く呼び出した場合は、
+ 組み込みのエラーハンドラが有効なままになります。エラーは発生しません。
+
@@ -69,15 +75,13 @@ Invalid serialized value.
&reftitle.seealso;
-
-
- error_reporting
- set_error_handler
- get_error_handler
- restore_exception_handler
- trigger_error
-
-
+
+ error_reporting
+ set_error_handler
+ get_error_handler
+ restore_exception_handler
+ trigger_error
+
-
+
restore_exception_handler
@@ -20,6 +20,27 @@
変更した後、元の例外ハンドラ(組込またはユーザー定義関数)に戻すために
使用されます。
+
+
+ 例外ハンドラの実行中は、有効な例外ハンドラが存在しない状態になります。
+ PHP 8.3.0 以降のエンジンは、ハンドラがスローした例外が再びそのハンドラに
+ 渡されないよう、ハンドラを呼び出す前にその設定を解除するからです。
+
+
+ さらに PHP 8.3.5 以降のエンジンは、呼び出そうとしているハンドラを
+ ハンドラスタックにプッシュします。
+ そのため、例外ハンドラの中から restore_exception_handler を
+ コールすると、そのエントリが取り除かれ、現在実行中のハンドラが再度設定されます。
+ その前に有効だったハンドラを設定するには、2 回コールする必要があります。
+
+
+ 実行中のハンドラは、リターンする際に自動的に再度設定されます。
+ ただし、その時点で有効な例外ハンドラが存在しない場合に限ります。
+ set_exception_handler または
+ restore_exception_handler をコールしたハンドラは、
+ ハンドラスタックの管理を自分自身で行うことになります。
+
+
@@ -34,6 +55,39 @@
+
+ &reftitle.changelog;
+
+
+
+
+
+ &Version;
+ &Description;
+
+
+
+
+ 8.3.5
+
+ 呼び出される例外ハンドラが、ハンドラスタックにプッシュされるようになりました。
+ そのため、例外ハンドラの中から restore_exception_handler を
+ コールすると、現在実行中のハンドラが再度設定されます。
+ その前に有効だったハンドラに戻すには、2 回コールする必要があります。
+
+
+
+ 8.3.0
+
+ 有効な例外ハンドラが、実行中は設定解除されるようになりました。
+
+
+
+
+
+
+
+
&reftitle.examples;
@@ -70,18 +124,16 @@
-
+
&reftitle.seealso;
-
-
- set_exception_handler
- get_exception_handler
- set_error_handler
- restore_error_handler
- error_reporting
-
-
+
+ set_exception_handler
+ get_exception_handler
+ set_error_handler
+ restore_error_handler
+ error_reporting
+
-
+
@@ -15,10 +15,12 @@
callablenullcallback
interror_levelsE_ALL
-
+
スクリプトのエラー処理を行うユーザー関数
(callback)を設定します。
-
+ それまで有効だったハンドラは、エラーハンドラの内部スタックに保存され、
+ restore_error_handler がそこから取り出します。
+
この関数は、実行時にカスタムのエラーハンドラを定義するために使います。
例えば、致命的なエラーの際にデータやファイルを消去する必要があるような
@@ -63,10 +65,13 @@
callback
-
- &null; を渡すと、ハンドラをデフォルトの状態に戻せます。
+
+ &null; を渡すと、ユーザー定義のハンドラは有効でなくなり、
+ エラーは組み込みのエラーハンドラが処理するようになります。
+ それまで有効だったハンドラはスタックに保存されたままなので、
+ restore_error_handler で元に戻せます。
それ以外の場合、次のシグネチャに従うコールバックを渡します:
-
+
boolhandler
@@ -342,24 +347,84 @@ vector d - fatal error
My ERROR [256] log(x) for x <= 0 is undefined, you used: scale = -2.5
Fatal error on line 35 in file trigger_error.php, PHP 5.2.1 (FreeBSD)
Aborting...
+]]>
+
+
+
+
+
+ 新しいハンドラから直前のハンドラを呼び出す
+
+ set_error_handler の戻り値は、それまで有効だったハンドラです。
+ これを新しいハンドラから呼び出せば、既存の振る舞いを保ったまま処理を追加できます。
+ これができるのは、そのハンドラがユーザー定義関数である場合だけです。
+ 組み込みのハンドラが有効だった場合は &null; が返されます。
+
+
+
+]]>
+
+ &example.outputs;
+
+
+
+ &reftitle.notes;
+
+
+ set_error_handler の戻り値をこの関数に渡し直して、
+ 直前のハンドラに戻そうとしてはいけません。
+ こうすると、スタックからエントリがひとつ取り除かれるのではなく、
+ 逆に新たなエントリが積まれます。
+ そのため、ループや長時間動作するプロセスではスタックが際限なく大きくなります。
+ さらに error_levels が E_ALL
+ にリセットされ、戻したはずのハンドラが受け取るエラーの範囲が、
+ 知らないうちに広がってしまいます。
+ 直前のハンドラに戻すために用意されているのが
+ restore_error_handler です。
+
+
+
+
&reftitle.seealso;
-
-
- ErrorException
- error_reporting
- restore_error_handler
- get_error_handler
- trigger_error
- エラーレベル定数
-
-
+
+ ErrorException
+ error_reporting
+ restore_error_handler
+ get_error_handler
+ trigger_error
+ エラーレベル定数
+
-
+
@@ -22,6 +22,34 @@
実行は、callback がコールされた後に
停止します。
+
+
+
+ 例外ハンドラの実行中は、有効な例外ハンドラが存在しない状態になります。
+ PHP 8.3.0 以降のエンジンは、ハンドラがスローした例外が再びそのハンドラに
+ 渡されないよう、ハンドラを呼び出す前にその設定を解除するからです。
+ そのため、ハンドラの中から set_exception_handler を
+ コールすると、前に定義されたハンドラは存在しないと報告されます。
+
+
+ さらに PHP 8.3.5 以降のエンジンは、呼び出そうとしているハンドラを
+ ハンドラスタックにプッシュします。
+ そのため、ハンドラの中から restore_exception_handler を
+ コールすると、その前に有効だったハンドラではなく、
+ 現在実行中のハンドラが再度設定されます。
+
+
+ 実行中のハンドラは、リターンする際に自動的に再度設定されます。
+ ただし、その時点で有効な例外ハンドラが存在しない場合に限ります。
+ ハンドラが set_exception_handler または
+ restore_exception_handler をコールした時点で、
+ この自動的な復元は行われなくなり、
+ ハンドラ自身が設定したままのハンドラが有効になります。
+
+
+ したがって、例外ハンドラの中から例外ハンドラを変更することは推奨されません。
+
+
@@ -65,6 +93,40 @@
+
+ &reftitle.changelog;
+
+
+
+
+
+ &Version;
+ &Description;
+
+
+
+
+ 8.3.5
+
+ 呼び出される例外ハンドラがハンドラスタックにプッシュされ、
+ リターンした時点で再度設定されるようになりました。
+ ただし、ハンドラ自身がスタックを変更した場合は除きます。
+
+
+
+ 8.3.0
+
+ 有効な例外ハンドラが、実行中は設定解除されるようになりました。
+ そのため、ハンドラの中から set_exception_handler を
+ コールすると、前に定義されたハンドラは存在しないと報告されます。
+
+
+
+
+
+
+
+
&reftitle.examples;
@@ -90,15 +152,13 @@ echo "Not Executed\n";
&reftitle.seealso;
-
-
- get_exception_handler
- restore_exception_handler
- restore_error_handler
- error_reporting
- 例外(exceptions)
-
-
+
+ get_exception_handler
+ restore_exception_handler
+ restore_error_handler
+ error_reporting
+ 例外(exceptions)
+
diff --git a/reference/pcre/book.xml b/reference/pcre/book.xml
index 1d4c8f8589..4a5c173e87 100644
--- a/reference/pcre/book.xml
+++ b/reference/pcre/book.xml
@@ -1,50 +1,42 @@
-
+
正規表現 (Perl 互換)
- PCRE
+ PCRE
&reftitle.intro;
-
- この正規表現関数で使用するパターンの構文は、Perl と類似しています。
- 正規表現は、スラッシュ (/) などのデリミタで囲う必要があります。
- デリミタには使用できるのは、非英数字、非空白文字の任意の ASCII
- 文字ですが、バックスラッシュ (\) と null バイトは使用できません。
- デリミタ文字を正規表現本体において使用する必要がある場合は、
- バックスラッシュでエスケープします。
- Perl形式の (), {}, [], <> を使用することもできるでしょう。
- パターンの詳細については、パターン構文
+
+ この拡張モジュールは、正規表現によるパターンマッチ機能を PHP に統合します。
+ フリーでオープンソースの
+ PCRE2 ライブラリをベースにしています。
+ このライブラリは、Perl と互換性のある構文とセマンティクスを用いて
+ 正規表現によるパターンマッチを実装していますが、
+ いくつかドキュメント化されている違いがあります。
+ 詳細については、パターン構文
+ とパターン修飾子
を参照ください。
-
-
- 様々な修飾子を終端デリミタの後に付け、
- マッチングに変化を与えることができます。
- パターン修飾子
- を参照ください。
-
+
+
+ パフォーマンスを向上させるため、この拡張モジュールはコンパイル済みの正規表現をキャッシュします。
+ キャッシュはスレッドごとに専用のものがあり、最大 4096 個の正規表現を保持できます。
+
-
- この拡張モジュールでは、コンパイルした正規表現のために
- スレッド単位のグローバルキャッシュ (最大 4096) を管理しています。
-
+
+ キャッシュがいっぱいになると、現在使用されていない古いエントリをまとめて破棄し、
+ 新しいエントリのための領域を空けます。キャッシュのサイズは設定できません。
+
-
- PCRE には、いくつかの制限があります。詳細は、&url.pcre.man; を参照ください。
-
+
+ PCRE2 にはサイズなどの制限があり、
+ 場合によってはこれが影響することがあります。
+
-
-
- PCRE ライブラリは、Perl 5 と同じ文法構文を用いた
- 正規表現パターンマッチ処理を実装した関数群ですが、多少異なる点もあります
- (以下を参照ください)。現在の実装は Perl 5.005 に対応しています。
-
&reference.pcre.setup;
diff --git a/reference/pcre/configure.xml b/reference/pcre/configure.xml
index ab2956494e..82d9730b89 100644
--- a/reference/pcre/configure.xml
+++ b/reference/pcre/configure.xml
@@ -1,32 +1,33 @@
-
+
&reftitle.install;
-
+
PCRE は PHP のコア拡張モジュールなので、常に有効となっています。
- デフォルトでは、この拡張モジュールのコンパイルには、バンドルされている PCRE
- ライブラリを利用します。別の PCRE ライブラリを使ってコンパイルする場合は、オプション
- を利用します。
- このとき DIR には、PCRE のインクルードファイルやライブラリファイルがある場所を指定します。
- PCRE 8.10 以降を使うことを推奨します。PHP 7.3.0 以降では、PCRE2 が必須になっています。
-
-
- PCRE の JIT(ジャストインタイムコンパイル) 機能はデフォルトでサポートされています。
- PHP 7.0.12 以降では、 構成オプションで無効化できます。
-
+
+
+ デフォルトでは、この拡張モジュールはバンドルされている PCRE2 ライブラリを利用します。
+ Windows 以外のシステムでは、
+ 構成オプションを指定すると、代わりに外部の PCRE2 ライブラリを利用できます。
+ サポートされる最低バージョンは 10.30 です。
+ Windows のビルドでは、常にバンドルされているライブラリが使われます。
+
+
+ PCRE2 の JIT(ジャストインタイムコンパイル) 機能はデフォルトで有効になっています。
+ 構成オプションで無効化できます。
+
&windows.builtin;
-
- PCRE は活発なプロジェクトであり、変化し続けています。
+
+ PCRE2 は活発なプロジェクトであり、変化し続けています。
PHP で使える機能もそれに依存しています。
- PHP のドキュメントも部分的に時代遅れになっている可能性があり、
- PCRE の最新機能は網羅できていないかもしれません。
+ PHP のドキュメントも部分的に時代遅れになっている可能性があります。
変更点の一覧は、
- PCRE ライブラリの変更履歴
- を参照ください。また、バンドルされている PCRE
- の履歴も参考になるでしょう。
-
+ PCRE2 ライブラリの変更履歴
+ を参照ください。
+ バンドルされているライブラリの更新履歴は以下のとおりです。
+
バンドルされている PCRE ライブラリの更新履歴
@@ -39,16 +40,31 @@
+
+ 8.4.0
+ 10.44
+
+
+
+ 8.3.0
+ 10.42
+
+
8.2.0
10.40
- 8.1.0
+ 8.1.1
10.39
+
+ 8.1.0
+ 10.37
+
+
7.4.12, 8.0.0
10.35
diff --git a/reference/pcre/constants.xml b/reference/pcre/constants.xml
index 670888bce7..07dcf52475 100644
--- a/reference/pcre/constants.xml
+++ b/reference/pcre/constants.xml
@@ -1,6 +1,6 @@
-
+
&reftitle.constants;
@@ -103,6 +103,11 @@
このフラグがないと、マッチしなかったサブパターンは
空文字列にマッチしたかのように空文字列として報告されます。
このフラグを設定することで、これらふたつの場合を区別できます。
+ preg_match では、このフラグを使わない限り、
+ 末尾にあるマッチしなかったサブパターンは
+ $matches にまったく含まれません。
+ PHP 7.4.0 以降は、このフラグを設定するとそれらが &null; として報告されるため、
+ $matches のサイズが常に同じになります。
7.2.0
diff --git a/reference/pcre/pattern.differences.xml b/reference/pcre/pattern.differences.xml
index 42f7f9cb8f..c7c9719d44 100644
--- a/reference/pcre/pattern.differences.xml
+++ b/reference/pcre/pattern.differences.xml
@@ -1,135 +1,15 @@
-
+
-
+
Perl との違い
Perl とは異なる点
-
- Perl 5.005 との違いについて以下に説明します。
-
-
-
- デフォルトでは、空白文字は C ライブラリ関数 isspace()
- が認識する文字となります。PCRE を別の文字型テーブルを用いて
- コンパイルすることも可能です。通常、isspace() はスペース、改ページ、
- 改行、復帰、水平タブ、垂直タブにマッチします。 Perl 5 では、現在、
- 垂直タブが空白文字として扱われていません。 Perl ドキュメントには \v
- というエスケープが記載されていましたが、実際は認識されていませんでした。
- ただし、垂直タブ文字は少なくとも 5.002 までは空白文字として
- 処理されていました。 5.004 および 5.005 では、\s
- にマッチしなくなっています。
-
-
-
-
- PCRE では、先読み言明に量指定子を指定できません。Perl
- では可能ですが、思ったような動作を意味しないかもしれません。
- 例えば、(?!a){3} は、続く 3 文字が "a" でないことの言明ではありません。
- この指定は、次の 1 文字が "a" ではないことを 3 回言明するだけです。
-
-
-
-
- 否定の先読み言明の中に記述したキャプチャ用サブパターンは
- カウントされますが、対応するオフセットにそのエントリは
- セットされません。 Perlでは、言明のマッチングに失敗する前に
- マッチしたパターンからその変数を設定しますが、それが行われるのは、
- 否定の先読み言明中の選択肢が 1 つだけの場合のみです。
-
-
-
-
- ヌル文字は、検索対象文字列においては使用できますが、
- パターン文字列内では使用できません。これは、パターン文字列が 0
- を終端とする通常の C 文字列として渡されるためです。パターン中では、
- エスケープシーケンス "\x00" を使ってヌル文字を表すことができます。
-
-
-
-
- 次の Perl エスケープシーケンスはサポートされせん。
- \l, \u, \L, \U。
- これらのエスケープシーケンスは、Perl のパターンマッチエンジン内
- ではなく、文字列処理の部分で実装されているためです。
-
-
-
-
- Perl の \G 言明は、単一のパターンマッチに対しては意味がなく、
- サポートされません。
-
-
-
-
- 当然ながら、PCRE により、(?{code}) 構文および (??{code})
- 構文はサポートされません。しかし、再帰的なパターンはサポートしています。
-
-
-
-
- Perl 5.005_02 では、パターンの一部を繰り返すと、キャプチャ文字列の
- セットに関して奇妙な動作をすることがあるようです。例えば、"aba"
- を パターン /^(a(b)?)+$/ に対してマッチングを行うと、 $2 には値
- "b" が設定されますが、"aabbaa" を /^(aa(bb)?)+$/ に対して
- マッチングを行うと、$2 はセットされません。
- しかし、パターンを /^(aa(b(b))?)+$/ に変えると、
- $2 (および $3) はセットされます。
-
- Perl 5.004 では、どちらの場合も $2 はセットされます。 PCRE の場合も、
- どちらの場合でもセットされます。将来的に Perl が矛盾のない状態に
- 変更された場合は、PCRE も追従する可能性があります。
-
-
-
-
- 他の未解決の食い違いとして、パターン /^(a)?(?(1)a|b)+$/ は、
- Perl 5.005_02 では文字列 "a" にマッチしますが、PCRE ではマッチしない
- ということがあります。しかし、Perl と PCRE のいずれでも、/^(a)?a/
- で "a" をマッチした場合は $1 が未定義のままとなります。
-
-
-
-
- PCRE では、Perl の正規表現の機能よりさらに拡張された機能を使うことができます。
-
-
-
- 戻り読み言明は、固定長の文字列にマッチする必要がありますが、
- このとき、戻り読み言明内の選択肢は、それぞれ異なる長さの文字列に
- マッチするパターンとしても問題ありません。Perl 5.005 では
- すべての選択肢が同じ長さである必要があります。
-
-
-
-
- PCRE_DOLLAR_ENDONLY
- が設定され
- PCRE_MULTILINE
- が設定されていない場合、メタ文字 $ は文字列の終端にのみ
- マッチします。
-
-
-
-
- PCRE_EXTRA
- を設定すると、バックスラッシュの後に意味がない文字が続くと
- エラーとなります。
-
-
-
-
- PCRE_UNGREEDY
- を設定すると、量指定子の貪欲さが反転します。つまり、量指定子は、
- デフォルトで貪欲でなく、疑問符を後ろに付けてはじめて
- 貪欲になるようになります。
-
-
-
-
-
-
-
+
+ Perl も PCRE2 も継続的に変更されているため、具体的にどのような違いがあるかは、
+ 使用している PCRE2 ライブラリのバージョンによって異なります。最新の一覧は、
+ PCRE2 と Perl の違いに関する PCRE2 のドキュメントを参照ください。
+
-
+
パターン構文
@@ -34,12 +34,21 @@
デリミタ
-
+
PCRE 関数を使うときには、パターンを
delimiters で囲まなければなりません。
- 英数字、バックスラッシュ、空白文字以外の任意の文字をデリミタとして使うことができます。
+ 英数字、バックスラッシュ、NUL バイト、空白文字以外の任意のシングルバイト文字を
+ デリミタとして使うことができます。
有効なデリミタの前に空白文字を付けても、黙って無視されます。
-
+
+
+
+ マルチバイト文字 (UTF-8 でエンコードされた § のような文字) は、
+ デリミタとして使えません。PHP はデリミタとしてちょうど 1 バイトだけを読み込むので、
+ マルチバイト文字を使うと、残りのバイトが未知のパターン修飾子として
+ 解釈されてしまいます。
+
+
デリミタとしてよく使われる文字は、スラッシュ (/)、
ハッシュ記号 (#) およびチルダ (~) です。
@@ -1104,14 +1113,15 @@
事実上、これは Unicode 版の . だと考えてかまいません。
その文字をレンダリングするために実際に何文字が使われているかは考えずに、ひとつの合成文字に対応します。
-
+
8.32 より古いバージョンの PCRE (これは、組み込みの PCRE ライブラリを使っている場合には PHP 5.4.14 より前のバージョンにあたります) では、
\X は (?>\PM\pM*) と等価です。
つまり、記号 (mark) プロパティの付いていない文字と、その後に続く 0 以上の
記号プロパティ付きの文字にマッチし、その並びをアトミック (atomic) な
- まとまりとして取り扱います。記号プロパティ付きの文字とは、アクセント記号などの
+ まとまり ( を参照)
+ として取り扱います。記号プロパティ付きの文字とは、アクセント記号などの
直前の文字に対して影響するようなもののことです。
-
+
Unicode プロパティを使った文字列マッチングは速くありません。PCRE は
15,000 以上のデータからなるデータ構造を検索する必要が有るためです。
@@ -1555,6 +1565,11 @@
(?<name>pattern) および (?'name'pattern)
も用意されています。
+
+ PCRE2 10.44 をバンドルしている PHP 8.4.0 以降では、
+ サブパターン名の最大長は 128 文字です。
+ これより前のバージョンでは 32 文字でした。
+
複数の条件にマッチさせたいときに、
@@ -1961,49 +1976,67 @@
は、"foo" 以外の後にある "bar" の存在を見つけるものです。
+ 戻り読み言明は、可変長の文字列にマッチできます。
+ ただし、その長さには実装が定める上限があります。
+
+
+ (?<!dogs?|cats?)
+
+
+ のように長さの異なる選択肢を並べることも、
+
+
+ (?<=ab(c|de))
+
+
+ のように最上位の選択肢が複数の長さにマッチしうる場合も、
+ どちらも使用可能です。
+
+
+ 戻り読み言明の実装においては、選択肢ごとに一時的に固定の幅だけ
+ カレントの位置を後退させ、マッチを試みます。カレントの位置の前に
+ 十分な文字がない場合は、マッチは失敗とみなされます。
+ 再試行無しのサブパターンと組み合わせた戻り読み言明は、
+ 文字列の終端でのマッチングに特に有用です。
+ 再試行無しのサブパターンについてのセクションの最後にて例を示します。
+
+
+ PCRE2 10.44 をバンドルしている PHP 8.4.0 より前のバージョンでは、
戻り読み言明内のパターンは、それがマッチし得る文字列の長さが
- 固定でなければなりません〔繰り返しを指定できません〕。ただし、
+ 固定でなければなりませんでした〔繰り返しを指定できません〕。ただし、
選択肢を用いた場合、各選択肢は〔固定長でなければいけませんが〕
- すべて同じ長さである必要はありません。つまり、
+ すべて同じ長さである必要はありませんでした。つまり、
(?<=bullock|donkey)
- とはできますが、
+ とはできましたが、
(?<!dogs?|cats?)
- は、コンパイル時にエラーになります。
+ は、コンパイル時にエラーになりました。
戻り読み言明の最上位においてのみ、異なる長さの文字列にマッチするような
- 選択肢が使用可能です。Perl 5.005 においては、すべての選択肢が
- 同じ長さの文字列にマッチする必要があります。つまり、この機能は
- PCRE の拡張モジュールです。
+ 選択肢が使用可能でした。Perl 5.005 では、すべての選択肢が
+ 同じ長さの文字列にマッチする必要がありました。つまり、これは
+ Perl 5.005 に対する拡張でした。
(?<=ab(c|de))
という戻り読み言明は、最上位にひとつの選択肢しかなく、
- その選択肢は異なる長さの文字列にマッチしうるので、不正です。
+ その選択肢は異なる長さの文字列にマッチしうるので、不正でした。
しかし、
(?<=abc|abde)
-
+
のように、最上位において選択肢を 2 つ用いるように
- 書き換えると使用可能です。
-
-
- 後方言明の実装においては、選択肢ことに一時的に固定の幅だけ
- カレントの位置を後退させ、マッチを試みます。カレントの位置の前に
- 十分な文字がない場合は、マッチは失敗とみなされます。
- 再試行無しのサブパターンと組み合わせた戻り読み言明は、
- 文字列の終端でのマッチングに特に有用です。
- 再試行無しのサブパターンについてのセクションの最後にて例を示します。
+ 書き換えると使用可能でした。
(任意の種類の)複数の言明を連続して指定することも可能です。例えば、
@@ -2062,6 +2095,10 @@
再試行無しのサブパターン
+
+ 再試行無しのサブパターンは、アトミックグループ (atomic group)
+ とも呼ばれます。
+
繰り返し回数の下限もしくは上限の指定をした場合、
〔繰り返しを指定した要素の〕続きがマッチに失敗すると、