Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
251 changes: 151 additions & 100 deletions language/constants.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 4c352e683436649edba35a3272210d8ca4cae611 Maintainer: hirokawa Status: ready -->
<!-- EN-Revision: 5dc21d42fd5c1a8d6b0e45869c4fe3c3ac8e9a2c Maintainer: hirokawa Status: ready -->
<!-- CREDITS: takagi,mumumu -->

<chapter xml:id="language.constants" xmlns="http://docbook.org/ns/docbook" annotations="interactive">
Expand Down Expand Up @@ -282,112 +282,163 @@ echo ANIMALS_DEF[1] . "\n"; // 出力は "cat"

<sect1 xml:id="language.constants.magic">
<title>マジック定数</title>
<para>
使われる場所によって値が変化する定数(マジック定数)がいくつかあります。
例えば、<constant>__LINE__</constant>はスクリプト上において
使われる行によって値が変化します。
これらの
"マジック"定数は、実行時に解決される通常の定数とは異なり、コンパイル時に解決されます。
これらの特別な定数は大文字小文字を区別しません。
内容は以下のとおりです:
</para>
<para>
<table>
<title>PHP の "マジック" 定数</title>
<tgroup cols="2">
<thead>
<row>
<entry>&Name;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row xml:id="constant.line">
<entry><constant>__LINE__</constant></entry>
<entry>
ファイル上の現在の行番号。
</entry>
</row>
<row xml:id="constant.file">
<entry><constant>__FILE__</constant></entry>
<entry>
ファイルのフルパスとファイル名 (シンボリックリンクを解決した後のもの)。
インクルードされるファイルの中で使用された場合、インクルードされるファイルの名前が返されます。
</entry>
</row>
<row xml:id="constant.dir">
<entry><constant>__DIR__</constant></entry>
<entry>
そのファイルの存在するディレクトリ。include の中で使用すると、
インクルードされるファイルの存在するディレクトリを返します。
つまり、これは <literal>dirname(__FILE__)</literal> と同じ意味です。
ルートディレクトリである場合を除き、ディレクトリ名の末尾にスラッシュはつきません。
</entry>
</row>
<row xml:id="constant.function">
<entry><constant>__FUNCTION__</constant></entry>
<entry>
関数名。無名関数の場合は、<literal>{closure}</literal>
</entry>
</row>
<row xml:id="constant.class">
<entry><constant>__CLASS__</constant></entry>
<entry>
クラス名。
クラス名には、そのクラスが宣言されている名前空間も含みます
(例 <literal>Foo\Bar</literal>)。
トレイトのメソッド内で <constant>__CLASS__ </constant> を使うと、
そのトレイトを use しているクラスの名前を返します。
</entry>
</row>
<row xml:id="constant.trait">
<entry><constant>__TRAIT__</constant></entry>
<entry>
トレイト名。
トレイト名には、宣言された名前空間も含みます
(例 <literal>Foo\Bar</literal>)。
</entry>
</row>
<row xml:id="constant.method">
<entry><constant>__METHOD__</constant></entry>
<entry>
クラスのメソッド名。
</entry>
</row>
<row xml:id="constant.property">
<entry><constant>__PROPERTY__</constant></entry>
<entry>
プロパティ名。
<link linkend="language.oop5.property-hooks">プロパティフック</link>
の内部でのみ使用可能です。
</entry>
</row>
<row xml:id="constant.namespace">
<entry><constant>__NAMESPACE__</constant></entry>
<entry>
現在の名前空間の名前。
</entry>
</row>
<row xml:id="constant.coloncolonclass">
<entry><constant><replaceable>ClassName</replaceable>::class</constant></entry>
<entry>
完全に修飾されたクラス名。
</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
<simpara>
マジック定数は、ソースコード上の位置に関する情報に置き換えられるキーワードです。
置き換えられるのは、記述されているファイルと行、およびその箇所を囲む関数、クラス、トレイト、名前空間、プロパティフックの情報です。
「定数」という名前が付いていますが、実際の定数ではありません。
<function>defined</function> と <function>constant</function> はマジック定数を認識せず、
<function>define</function> で同じ名前の定数を作成しても、マジック定数には影響しません。
マジック定数は大文字小文字を区別しません。
クラスの外での <constant>__CLASS__</constant> のように、該当する文脈の外で使用すると、
空文字列に置き換えられます。
</simpara>
<table>
<title>PHP の "マジック" 定数</title>
<tgroup cols="2">
<thead>
<row>
<entry>&Name;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row xml:id="constant.line">
<entry><constant>__LINE__</constant></entry>
<entry>
記述されている行の番号。
</entry>
</row>
<row xml:id="constant.file">
<entry><constant>__FILE__</constant></entry>
<entry>
記述されているファイルのフルパスとファイル名。
シンボリックリンクは解決されます。
</entry>
</row>
<row xml:id="constant.dir">
<entry><constant>__DIR__</constant></entry>
<entry>
そのファイルの存在するディレクトリ。
これは <literal>dirname(__FILE__)</literal> と同じ意味です。
ルートディレクトリである場合を除き、ディレクトリ名の末尾にスラッシュはつきません。
</entry>
</row>
<row xml:id="constant.function">
<entry><constant>__FUNCTION__</constant></entry>
<entry>
記述されている関数の名前。
関数名には、その関数が宣言されている名前空間も含まれます
(例 <literal>Foo\bar</literal>)。
メソッドの中では、メソッド名だけになります。
無名関数の場合は、クロージャが定義された場所を含む、エンジンが生成した名前になります
(PHP 8.4.0 以降)。それより前のバージョンでは <literal>{closure}</literal> です。
</entry>
</row>
<row xml:id="constant.class">
<entry><constant>__CLASS__</constant></entry>
<entry>
記述されているクラスの名前。
クラス名には、そのクラスが宣言されている名前空間も含まれます
(例 <literal>Foo\Bar</literal>)。
トレイトの中では、そのトレイトを use しているクラスの名前になります。
<link linkend="language.oop5.anonymous">無名クラス</link>
の場合は、エンジンが生成した名前になります。
メソッドの呼び出し先となったクラスの名前を取得するには、
<link linkend="language.oop5.late-static-bindings"><literal>static::class</literal></link>
を使ってください。
</entry>
</row>
<row xml:id="constant.trait">
<entry><constant>__TRAIT__</constant></entry>
<entry>
トレイト名。
トレイト名には、宣言された名前空間も含まれます
(例 <literal>Foo\Bar</literal>)。
</entry>
</row>
<row xml:id="constant.method">
<entry><constant>__METHOD__</constant></entry>
<entry>
記述されているメソッドのクラス名とメソッド名
(例 <literal>Foo\Bar::baz</literal>)。
トレイトの中では、クラス名ではなくトレイト名が使われます。
メソッドの外では、<constant>__FUNCTION__</constant> と同じです。
</entry>
</row>
<row xml:id="constant.property">
<entry><constant>__PROPERTY__</constant></entry>
<entry>
<link linkend="language.oop5.property-hooks">プロパティフック</link>
の内部で使うと、そのプロパティの名前になります。
PHP 8.4.0 以降で利用可能です。
</entry>
</row>
<row xml:id="constant.namespace">
<entry><constant>__NAMESPACE__</constant></entry>
<entry>
現在の名前空間の名前。
</entry>
</row>
</tbody>
</tgroup>
</table>

<example>
<title>マジック定数の使用例</title>
<programlisting role="php">
<![CDATA[
<?php
namespace App;

function helper()
{
echo __FUNCTION__, "\n";
echo __METHOD__, "\n";
}

trait Greets
{
public function greet()
{
echo __CLASS__, "\n";
echo __TRAIT__, "\n";
echo __METHOD__, "\n";
echo __FUNCTION__, "\n";
}
}

class Greeter
{
use Greets;
}

helper();
(new Greeter)->greet();
echo __NAMESPACE__, "\n";
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
App\helper
App\helper
App\Greeter
App\Greets
App\Greets::greet
greet
App
]]>
</screen>
</example>

<sect2 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><link linkend="language.oop5.basic.class.class">::class</link></member>
<member><function>get_class</function></member>
<member><function>get_object_vars</function></member>
<member><function>file_exists</function></member>
<member><function>function_exists</function></member>
<member><function>get_called_class</function></member>
<member><function>dirname</function></member>
</simplelist>
</para>
</sect2>
Expand Down
6 changes: 3 additions & 3 deletions language/control-structures/alternative-syntax.xml
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: b8147b7f03506e41f01631c32a907b955593525a Maintainer: takagi Status: ready -->
<!-- EN-Revision: 72ea6871bb7b005110e6cbc42f17970c5a985826 Maintainer: takagi Status: ready -->

<sect1 xml:id="control-structures.alternative-syntax" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>制御構造に関する別の構文</title>
<?phpdoc print-version-for="control-structures.alternative-syntax"?>
<para>
PHPは、いくつかの制御構造、つまり、<literal>if</literal>、
<literal>while</literal>、<literal>for</literal>、
<literal>foreach</literal>、<literal>switch</literal>
<literal>foreach</literal>、<literal>switch</literal>、<literal>declare</literal>
に関する別の構文を提供します。
各構造において開き波括弧をコロン(:)、閉じ波括弧をそれぞれ
<literal>endif;</literal>,<literal>endwhile;</literal>,
<literal>endfor;</literal>,<literal>endforeach;</literal>,
<literal>endswitch;</literal>に変更するのが
<literal>endswitch;</literal>,<literal>enddeclare;</literal>に変更するのが
別の構文の基本的な形式となります。
<informalexample>
<programlisting role="php">
Expand Down
21 changes: 13 additions & 8 deletions language/operators/increment.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 16934048f79c6e117cd16a23c09c1b2ea502e284 Maintainer: mumumu Status: ready -->
<!-- EN-Revision: 4bf52f20bcb7f0f7dee5e8e1f6e8afc7126f06ce Maintainer: mumumu Status: ready -->
<sect1 xml:id="language.operators.increment">
<title>加算子/減算子</title>
<titleabbrev>加算子/減算子</titleabbrev>
Expand Down Expand Up @@ -93,16 +93,17 @@ int(4)
<warning>
<para>
<type>bool</type> 型の値に、加算子や減算子を適用しても何も起こりません。
PHP 8.3.0 以降では、この操作に対して <constant>E_WARNING</constant> が発生するようになりました。なぜなら、bool 型の値を暗黙のうちに数値型にキャストするように将来変更されるからです。
PHP 8.3.0 以降では、この操作に対して <constant>E_WARNING</constant> が発生するようになりました。将来的には、値が暗黙のうちに <type>int</type> にキャストされるようになります。
</para>
<para>
<type>null</type> 型の値に、減算子を適用しても何も起こりません。
PHP 8.3.0 以降では、この操作に対して <constant>E_WARNING</constant> が発生するようになりました。なぜなら、null 型の値を暗黙のうちに数値型にキャストするように将来変更されるからです。
PHP 8.3.0 以降では、この操作に対して <constant>E_WARNING</constant> が発生するようになりました。将来的には、値が暗黙のうちに <type>int</type> にキャストされるようになります。
</para>
<para>
<simpara>
<link linkend="language.types.numeric-strings">数値形式の文字列</link> でない文字列に対して、減算子を適用しても何も起こりません。
PHP 8.3.0 以降では、この操作に対して <constant>E_WARNING</constant> が発生するようになりました。なぜなら、こうした操作は <classname>TypeError</classname> がスローされるように将来変更されるからです。
</para>
ただし、空文字列は <literal>-1</literal> になります。
PHP 8.3.0 以降では、この操作に対して <constant>E_DEPRECATED</constant> が発生するようになりました。将来的には、<classname>TypeError</classname> がスローされるようになります。
</simpara>
</warning>
<note>
<para>
Expand All @@ -115,15 +116,19 @@ int(4)
<title>Perl 風の、文字列をインクリメントする機能</title>
<warning>
<simpara>
この機能は、PHP 8.3.0 以降は soft-deprecated 扱い
(<constant>E_DEPRECATED</constant> は発生しないものの、新しいコードではこの機能を使うべきではない) になっています。
この機能は、PHP 8.3.0 以降は soft-deprecated 扱いになっています。
<function>str_increment</function> を代わりに使いましょう。
PHP 8.5.0 以降では、数値形式でない文字列をインクリメントすると、推奨されない警告が発生するようになりました。
</simpara>
</warning>

<para>
PHP では、<link linkend="language.types.numeric-strings">数値形式の文字列</link> でない文字列をインクリメントすることも可能です。この場合、文字列は英数字からなる、ASCII 文字列である必要があり、文字を次の文字に変更します。文字が <literal>Z</literal> に達すると、左の文字がひとつ繰り上がります。たとえば、<code>$a = 'Z'; $a++;</code> というコードは、<varname>$a</varname> を <literal>'AA'</literal> に変更します。
</para>
<simpara>
PHP 8.3.0 以降では、空文字列や、英数字以外の文字を含む文字列をインクリメントすると、<constant>E_DEPRECATED</constant> が発生するようになりました。
PHP 8.5.0 以降では、数値形式でない文字列すべてが対象になりました。
</simpara>

<example>
<title>Perl 風に、文字列をインクリメントする例</title>
Expand Down
10 changes: 9 additions & 1 deletion language/types/never.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 7132d8833a86604aa2d10c16c0470d0ef1a0fdfb Maintainer: mumumu Status: ready -->
<!-- EN-Revision: 18a1cc50345c2d75983290a3863e451da2c2ecb9 Maintainer: mumumu Status: ready -->
<sect1 xml:id="language.types.never">
<title>Never</title>

Expand All @@ -13,6 +13,14 @@
よって、この型は <link linkend="language.types.type-system.composite.union">union 型</link> の一部として指定することが出来ません。
PHP 8.1.0 以降で利用できます。
</para>
<simpara>
戻り値の型が <type>never</type> である関数の中で <literal>return</literal> 文を書くと、
実行時にその <literal>return</literal> に到達しない場合でも、
コンパイル時にエラーになります。
こうした関数が、スクリプトを終了することも、
例外をスローすることも、無限ループに入ることもなく末尾まで実行されると、
<exceptionname>TypeError</exceptionname> がスローされます。
</simpara>
<simpara>
<type>never</type> は、
型理論の用語で言うと、ボトム型にあたります。
Expand Down
11 changes: 10 additions & 1 deletion language/types/void.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 7132d8833a86604aa2d10c16c0470d0ef1a0fdfb Maintainer: mumumu Status: ready -->
<!-- EN-Revision: fff1bba97cc9c9f86f7e49e4074e1e5792df77be Maintainer: mumumu Status: ready -->
<sect1 xml:id="language.types.void">
<title>Void</title>

Expand All @@ -9,6 +9,15 @@
戻り値のみで指定できる型ですが、関数自体が終了することはあります。
よって、この型は <link linkend="language.types.type-system.composite.union">union 型</link> の一部として指定することが出来ません。 PHP 7.1.0 以降で利用できます。
</para>
<simpara>
戻り値の型が <type>void</type> である関数の中で、式を指定した <literal>return</literal> 文を書くと、
実行時にその <literal>return</literal> に到達しない場合でも、
コンパイル時にエラーになります。
<literal>return null;</literal> と書いた場合も同様です。
関数を途中で抜けるには、式を指定しない <literal>return;</literal> を使います。
後述の <literal>null</literal> は、
関数を呼び出したときに暗黙的に得られる値にすぎません。
</simpara>

<note>
<simpara>
Expand Down
Loading