diff --git a/appendices/tokens.xml b/appendices/tokens.xml index 4ef9507076..f0691247c1 100644 --- a/appendices/tokens.xml +++ b/appendices/tokens.xml @@ -1,8 +1,7 @@ - + - パーサートークンの一覧 @@ -55,123 +54,189 @@ defined('T_FN') || define('T_FN', 10001); - T_ABSTRACT + + T_ABSTRACT + (int) + abstract - T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG + + T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG + (int) + & (PHP 8.1.0 以降で利用可能) - T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG + + T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG + (int) + & (PHP 8.1.0 以降で利用可能) - T_AND_EQUAL + + T_AND_EQUAL + (int) + &= 代入演算子 - T_ARRAY + + T_ARRAY + (int) + array() array, array 構文 - T_ARRAY_CAST + + T_ARRAY_CAST + (int) + (array) 型キャスト - T_AS + + T_AS + (int) + as &foreach; - T_ATTRIBUTE + + T_ATTRIBUTE + (int) + #[ アトリビュート (PHP 8.0.0 以降で利用可能) - T_BAD_CHARACTER - + + T_BAD_CHARACTER + (int) + + ASCII 32以下の全ての文字。\t (0x09), \n (0x0a) , \r (0x0d) は除く (PHP 7.4.0 以降で利用可能) - T_BOOLEAN_AND + + T_BOOLEAN_AND + (int) + && 論理演算子 - T_BOOLEAN_OR + + T_BOOLEAN_OR + (int) + || 論理演算子 - T_BOOL_CAST + + T_BOOL_CAST + (int) + (bool) or (boolean) 型キャスト - T_BREAK + + T_BREAK + (int) + break break - T_CALLABLE + + T_CALLABLE + (int) + callable callable - T_CASE + + T_CASE + (int) + case switch - T_CATCH + + T_CATCH + (int) + catch - T_CLASS + + T_CLASS + (int) + class クラスとオブジェクト - T_CLASS_C + + T_CLASS_C + (int) + __CLASS__ マジック定数 - T_CLONE + + T_CLONE + (int) + clone クラスとオブジェクト - T_CLOSE_TAG + + T_CLOSE_TAG + (int) + ?> or %> HTML からの脱出 - T_COALESCE + + T_COALESCE + (int) + ?? 比較演算子 - T_COALESCE_EQUAL + + T_COALESCE_EQUAL + (int) + ??= NULL合体代入演算子 @@ -179,82 +244,126 @@ defined('T_FN') || define('T_FN', 10001); - T_COMMENT + + T_COMMENT + (int) + // or #, and /* */ コメント - T_CONCAT_EQUAL + + T_CONCAT_EQUAL + (int) + .= 代入演算子 - T_CONST + + T_CONST + (int) + const クラス定数 - T_CONSTANT_ENCAPSED_STRING + + T_CONSTANT_ENCAPSED_STRING + (int) + "foo" or 'bar' 文字列構文 - T_CONTINUE + + T_CONTINUE + (int) + continue continue - T_CURLY_OPEN + + T_CURLY_OPEN + (int) + {$ 高度な文字列補間 - T_DEC + + T_DEC + (int) + -- - 可算/減算演算子 + 可算/減算演算子 - T_DECLARE + + T_DECLARE + (int) + declare declare - T_DEFAULT + + T_DEFAULT + (int) + default switch - T_DIR + + T_DIR + (int) + __DIR__ マジック定数 - T_DIV_EQUAL + + T_DIV_EQUAL + (int) + /= 代入演算子 - T_DNUMBER + + T_DNUMBER + (int) + 0.12, etc. 浮動小数点数 - T_DO + + T_DO + (int) + do do..while - T_DOC_COMMENT + + T_DOC_COMMENT + (int) + /** */ PHPDoc 形式のコメント - T_DOLLAR_OPEN_CURLY_BRACES + + T_DOLLAR_OPEN_CURLY_BRACES + (int) + ${ 単純な @@ -262,133 +371,198 @@ defined('T_FN') || define('T_FN', 10001); - T_DOUBLE_ARROW + + T_DOUBLE_ARROW + (int) + => array 構文 - T_DOUBLE_CAST + + T_DOUBLE_CAST + (int) + (real), (double) or (float) 型キャスト - T_DOUBLE_COLON + + T_DOUBLE_COLON + (int) + :: T_PAAMAYIM_NEKUDOTAYIM を参照ください - T_ECHO + + T_ECHO + (int) + echo echo - T_ELLIPSIS + + T_ELLIPSIS + (int) + ... 関数の引数 - T_ELSE + + T_ELSE + (int) + else else - T_ELSEIF + + T_ELSEIF + (int) + elseif elseif - T_EMPTY + + T_EMPTY + (int) + empty empty - T_ENCAPSED_AND_WHITESPACE + + T_ENCAPSED_AND_WHITESPACE + (int) + " $a" 文字列のパース - T_ENDDECLARE + + T_ENDDECLARE + (int) + enddeclare - declare, 別の構文 + declare, 別の構文 - T_ENDFOR + + T_ENDFOR + (int) + endfor - for, 別の構文 + for, 別の構文 - T_ENDFOREACH + + T_ENDFOREACH + (int) + endforeach - &foreach;, 別の構文 + &foreach;, 別の構文 - T_ENDIF + + T_ENDIF + (int) + endif - if, 別の構文 + if, 別の構文 - T_ENDSWITCH + + T_ENDSWITCH + (int) + endswitch - switch, 別の構文 + switch, 別の構文 - T_ENDWHILE + + T_ENDWHILE + (int) + endwhile - while, 別の構文 + while, 別の構文 - T_ENUM + + T_ENUM + (int) + enum Enumerations (PHP 8.1.0 以降で利用可能) - T_END_HEREDOC - + + T_END_HEREDOC + (int) + + ヒアドキュメント構文 - T_EVAL + + T_EVAL + (int) + eval() eval - T_EXIT + + T_EXIT + (int) + exit or die exit, die - T_EXTENDS + + T_EXTENDS + (int) + extends - extends, クラスとオブジェクト + extends, クラスとオブジェクト - T_FILE + + T_FILE + (int) + __FILE__ マジック定数 - T_FINAL + + T_FINAL + (int) + final - T_FINALLY + + T_FINALLY + (int) + finally - T_FN + + T_FN + (int) + fn アロー関数 @@ -396,425 +570,650 @@ defined('T_FN') || define('T_FN', 10001); - T_FOR + + T_FOR + (int) + for for - T_FOREACH + + T_FOREACH + (int) + foreach &foreach; - T_FUNCTION + + T_FUNCTION + (int) + function 関数 - T_FUNC_C + + T_FUNC_C + (int) + __FUNCTION__ マジック定数 - T_GLOBAL + + T_GLOBAL + (int) + global 変数のスコープ - T_GOTO + + T_GOTO + (int) + goto goto - T_HALT_COMPILER + + T_HALT_COMPILER + (int) + __halt_compiler() - T_IF + + T_IF + (int) + if if - T_IMPLEMENTS + + T_IMPLEMENTS + (int) + implements - T_INC + + T_INC + (int) + ++ - 可算/減算演算子 + 可算/減算演算子 - T_INCLUDE + + T_INCLUDE + (int) + include include - T_INCLUDE_ONCE + + T_INCLUDE_ONCE + (int) + include_once include_once - T_INLINE_HTML - + + T_INLINE_HTML + (int) + + PHP の外部のテキスト - T_INSTANCEOF + + T_INSTANCEOF + (int) + instanceof 型演算子 - T_INSTEADOF + + T_INSTEADOF + (int) + insteadof - T_INTERFACE + + T_INTERFACE + (int) + interface - T_INT_CAST + + T_INT_CAST + (int) + (int) or (integer) 型キャスト - T_ISSET + + T_ISSET + (int) + isset() isset - T_IS_EQUAL + + T_IS_EQUAL + (int) + == 比較演算子 - T_IS_GREATER_OR_EQUAL + + T_IS_GREATER_OR_EQUAL + (int) + >= 比較演算子 - T_IS_IDENTICAL + + T_IS_IDENTICAL + (int) + === 比較演算子 - T_IS_NOT_EQUAL + + T_IS_NOT_EQUAL + (int) + != or <> 比較演算子 - T_IS_NOT_IDENTICAL + + T_IS_NOT_IDENTICAL + (int) + !== 比較演算子 - T_IS_SMALLER_OR_EQUAL + + T_IS_SMALLER_OR_EQUAL + (int) + <= 比較演算子 - T_LINE + + T_LINE + (int) + __LINE__ マジック定数 - T_LIST + + T_LIST + (int) + list() list - T_LNUMBER + + T_LNUMBER + (int) + 123, 012, 0x1ac, etc. 整数 - T_LOGICAL_AND + + T_LOGICAL_AND + (int) + and 論理演算子 - T_LOGICAL_OR + + T_LOGICAL_OR + (int) + or 論理演算子 - T_LOGICAL_XOR + + T_LOGICAL_XOR + (int) + xor 論理演算子 - T_MATCH + + T_MATCH + (int) + match &match; (PHP 8.0.0 以降で利用可能) - T_METHOD_C + + T_METHOD_C + (int) + __METHOD__ マジック定数 - T_MINUS_EQUAL + + T_MINUS_EQUAL + (int) + -= 代入演算子 - T_MOD_EQUAL + + T_MOD_EQUAL + (int) + %= 代入演算子 - T_MUL_EQUAL + + T_MUL_EQUAL + (int) + *= 代入演算子 - T_NAMESPACE + + T_NAMESPACE + (int) + namespace 名前空間 - T_NAME_FULLY_QUALIFIED + + T_NAME_FULLY_QUALIFIED + (int) + \App\Namespace 名前空間 (PHP 8.0.0 以降で利用可能) - T_NAME_QUALIFIED + + T_NAME_QUALIFIED + (int) + App\Namespace 名前空間 (PHP 8.0.0 以降で利用可能) - T_NAME_RELATIVE + + T_NAME_RELATIVE + (int) + namespace\Namespace 名前空間 (PHP 8.0.0 以降で利用可能) - T_NEW + + T_NEW + (int) + new クラスとオブジェクト - T_NS_C + + T_NS_C + (int) + __NAMESPACE__ 名前空間 - T_NS_SEPARATOR + + T_NS_SEPARATOR + (int) + \ 名前空間 - T_NUM_STRING + + T_NUM_STRING + (int) + "$a[0]" 文字列内の配列の添字 - T_OBJECT_CAST + + T_OBJECT_CAST + (int) + (object) 型キャスト - T_OBJECT_OPERATOR + + T_OBJECT_OPERATOR + (int) + -> クラスとオブジェクト - T_NULLSAFE_OBJECT_OPERATOR + + T_NULLSAFE_OBJECT_OPERATOR + (int) + ?-> クラスとオブジェクト - T_OPEN_TAG + + T_OPEN_TAG + (int) + <?php, <? or <% HTML からのエスケープ - T_OPEN_TAG_WITH_ECHO + + T_OPEN_TAG_WITH_ECHO + (int) + <?= or <%= escaping from HTML - T_OR_EQUAL + + T_OR_EQUAL + (int) + |= 代入演算子 - T_PAAMAYIM_NEKUDOTAYIM + + T_PAAMAYIM_NEKUDOTAYIM + (int) + :: スコープ定義演算子。T_DOUBLE_COLONとしても定義されています。 + + T_PIPE + |> + + パイプ演算子 (PHP 8.5.0 以降で利用可能) + + - T_PLUS_EQUAL + + T_PLUS_EQUAL + (int) + += 代入演算子 - T_POW + + T_POW + (int) + ** 算術演算子 - T_POW_EQUAL + + T_POW_EQUAL + (int) + **= 代入演算子 - T_PRINT + + T_PRINT + (int) + print print - T_PRIVATE + + T_PRIVATE + (int) + private クラスとオブジェクト - T_PRIVATE_SET + + T_PRIVATE_SET + (int) + private(set) プロパティフック (PHP 8.4.0 以降で利用可能) - T_PROPERTY_C + + T_PROPERTY_C + (int) + __PROPERTY__ マジック定数 - T_PROTECTED + + T_PROTECTED + (int) + protected クラスとオブジェクト - T_PROTECTED_SET + + T_PROTECTED_SET + (int) + protected(set) プロパティフック (PHP 8.4.0 以降で利用可能) - T_PUBLIC + + T_PUBLIC + (int) + public クラスとオブジェクト - T_PUBLIC_SET + + T_PUBLIC_SET + (int) + public(set) プロパティフック (PHP 8.4.0 以降で利用可能) - T_READONLY + + T_READONLY + (int) + readonly クラスとオブジェクト (PHP 8.1.0 以降で利用可能) - T_REQUIRE + + T_REQUIRE + (int) + require require - T_REQUIRE_ONCE + + T_REQUIRE_ONCE + (int) + require_once require_once - T_RETURN + + T_RETURN + (int) + return 値を返す - T_SL + + T_SL + (int) + << ビット演算子 - T_SL_EQUAL + + T_SL_EQUAL + (int) + <<= 代入演算子 - T_SPACESHIP + + T_SPACESHIP + (int) + <=> 比較演算子 - T_SR + + T_SR + (int) + >> ビット演算子 - T_SR_EQUAL + + T_SR_EQUAL + (int) + >>= 代入演算子 - T_START_HEREDOC + + T_START_HEREDOC + (int) + <<< ヒアドキュメント構文 - T_STATIC + + T_STATIC + (int) + static 変数のスコープ - T_STRING + + T_STRING + (int) + parent, self, etc. 識別子。たとえば parentself @@ -823,12 +1222,18 @@ defined('T_FN') || define('T_FN', 10001); - T_STRING_CAST + + T_STRING_CAST + (int) + (string) 型キャスト - T_STRING_VARNAME + + T_STRING_VARNAME + (int) + "${a 可変変数 @@ -836,79 +1241,128 @@ defined('T_FN') || define('T_FN', 10001); - T_SWITCH + + T_SWITCH + (int) + switch switch - T_THROW + + T_THROW + (int) + throw - T_TRAIT + + T_TRAIT + (int) + trait - T_TRAIT_C + + T_TRAIT_C + (int) + __TRAIT__ __TRAIT__ - T_TRY + + T_TRY + (int) + try - T_UNSET + + T_UNSET + (int) + unset() unset - T_UNSET_CAST + + T_UNSET_CAST + (int) + (unset) 型キャスト - T_USE + + T_USE + (int) + use 名前空間 - T_VAR + + T_VAR + (int) + var クラスとオブジェクト - T_VARIABLE + + T_VARIABLE + (int) + $foo 変数 + + T_VOID_CAST + (void) + void キャスト (PHP 8.5.0 以降で利用可能) + - T_WHILE + + T_WHILE + (int) + while - while, do..while + while, do..while - T_WHITESPACE + + T_WHITESPACE + (int) + \t \r\n - + - T_XOR_EQUAL + + T_XOR_EQUAL + (int) + ^= 代入演算子 - T_YIELD + + T_YIELD + (int) + yield ジェネレータ - T_YIELD_FROM + + T_YIELD_FROM + (int) + yield from ジェネレータ @@ -919,7 +1373,6 @@ defined('T_FN') || define('T_FN', 10001); token_name も参照ください。 - - + 簡易チュートリアル @@ -319,15 +319,15 @@ if (str_contains($_SERVER['HTTP_USER_AGENT'], 'Firefox')) { -

str_contains() がtrueを返しました

-
あなたはFirefoxを使用しています
- +

str_contains() がtrueを返しました

+
あなたはFirefoxを使用しています
+ -

str_contains()がfalseを返しました

-
あなたはFirefoxを使用していません
- +

str_contains()がfalseを返しました

+
あなたはFirefoxを使用していません
+ ]]> @@ -436,16 +436,84 @@ if (str_contains($_SERVER['HTTP_USER_AGENT'], 'Firefox')) { 次にするべきことは? + + ここで得た知識により、マニュアルのほとんどの部分を理解できるようになったはずです。 + - ここで得た知識により、マニュアルのほとんどの部分、 - そしてサンプルのアーカイブにある多くのスクリプトの例を理解できるようになったはずです。 + 特に、以下の機能を調べてみるとよいでしょう: + + ファイルシステム関数を使ってファイルを読み書きする + ファイルのアップロードを処理する + Curl を使ってリモートのページやファイルを取得する + + PDO を使ってデータベースにデータを保存し、分析する + (SQLite はデータベースサーバーを動かさなくても使えます) + + セッションを使ってリクエストをまたいでデータを保持する + + + あらゆる場面に対応する膨大なライブラリやフレームワークが、 + Packagist リポジトリにそろっており、 + いずれも Composer パッケージマネージャを使ってインストールできます。 + + + コミュニティによる手助けやアドバイスについては、ヘルプページを確認してください。 + + + さまざまなポッドキャストやプレゼンテーション、その他の動画については、 + コミュニティの PeerTube を確認してください。 + + + 役に立つその他のコミュニティのリソースとしては、「awesome リスト」 (厳選されたリンク集) や + 「開発者ロードマップ」 (関連トピックの一覧) などがあります。 + - この他 PHP でできる多くのことを示すスライドプレゼンテーションを見るには、 - PHP カンファレンスマテリアルサイト - &url.php.talks; - を参照ください。 + どこから手をつければよいか見当もつかず行き詰まったときは、 + プロジェクトや問題をより小さな部分に分解してみましょう。 + そうすれば、自分がすでにできることと、これから学ぶ必要があることを見極めやすくなります。 + この分解は必要なだけ深く / 詳細にして構いません。 + たとえば、ブログを作る場合は以下のような部分に分解できるでしょう: + + + ページの一覧表示と閲覧 + + + データベースからレコード (ページ) を読み込む + + + + + ページの作成 + + + フォームの送信を処理する + + + データベースにレコード (ページ) を書き込む + + + + + 管理者ログイン + + + データベースからレコード (ユーザー) を読み込む + + + パスワードを扱う + + + リクエストやページをまたいでデータ (ユーザーのログイン) を保持する (セッション) + + + + + + 特に作りたいものがない場合は、kata やチャレンジ、「コードゴルフ」といったコーディング演習を探してみるのもよいでしょう。 + PHP に特化したものでなくても、ほとんどは解くことができ、知識と思考力を試すよい挑戦になるはずです。 +
diff --git a/language/functions.xml b/language/functions.xml index d88fa49f13..e20eea6dd0 100644 --- a/language/functions.xml +++ b/language/functions.xml @@ -1,8 +1,8 @@ - + - + 関数 @@ -17,7 +17,7 @@ <literal>foo</literal> という名前の新しい関数を宣言する - + ]]> @@ -34,11 +33,10 @@ function foo($arg_1, $arg_2, /* ..., */ $arg_n) PHP 8.0.0 以降では、 パラメーターのリストの末尾に、カンマを付加できるようになっています: - + ]]> @@ -74,12 +72,16 @@ function foo($arg_1, $arg_2,) { } ]]> @@ -121,6 +121,9 @@ function foo() /* ここでは関数bar()はまだ定義されていないので コールすることはできません。 */ +if (function_exists('bar')) { + bar(); +} foo(); @@ -129,8 +132,6 @@ foo(); コールすることができます。*/ bar(); - -?> ]]> @@ -176,7 +177,8 @@ function recursion($a) recursion($a + 1); } } -?> + +recursion(17); ]]> @@ -219,14 +221,13 @@ function recursion($a) PHP 7.3.0 以降では、 関数コールの引数リストの末尾にも、カンマを付加できるようになっています: - + ]]> @@ -241,7 +242,7 @@ $v = foo( 関数のパラメーターリストの最後にカンマを付ける - + ]]> @@ -285,7 +285,6 @@ function add_some_extra(&$string) $str = 'This is a string, '; add_some_extra($str); echo $str; // 出力は 'This is a string, and something extra.' となります -?> ]]> @@ -318,7 +317,6 @@ function makecoffee($type = "cappuccino") echo makecoffee(); echo makecoffee(null); echo makecoffee("espresso"); -?> ]]> &example.outputs; @@ -350,7 +348,7 @@ function makecoffee($types = array("cappuccino"), $coffeeMaker = NULL) return "Making a cup of ".join(", ", $types)." with $device.\n"; } echo makecoffee(); -echo makecoffee(array("cappuccino", "lavazza"), "teapot");?> +echo makecoffee(array("cappuccino", "lavazza"), "teapot"); ]]> @@ -377,7 +375,6 @@ function makecoffee($coffeeMaker = new DefaultCoffeeMaker) } echo makecoffee(); echo makecoffee(new FancyCoffeeMaker); -?> ]]> @@ -405,14 +402,18 @@ function makeyogurt($container = "bowl", $flavour) } echo makeyogurt("raspberry"); // $container に "raspberry" を指定します。$flavour ではありません。 -?> ]]> &example.outputs; @@ -432,7 +433,6 @@ function makeyogurt($flavour, $container = "bowl") } echo makeyogurt("raspberry"); // $flavour に "raspberry" を指定します。 -?> ]]> &example.outputs; @@ -461,7 +461,6 @@ function makeyogurt($container = "bowl", $flavour = "raspberry", $style = "Greek } echo makeyogurt(style: "natural"); -?> ]]> &example.outputs; @@ -487,7 +486,7 @@ Making a bowl of raspberry natural yogurt. を使用する必要があります。 デフォルト値を指定したパラメーターは、必須のパラメーターの後に宣言する - + ]]> @@ -544,7 +542,6 @@ function sum(...$numbers) { } echo sum(1, 2, 3, 4); -?> ]]> &example.outputs; @@ -573,7 +570,6 @@ echo add(...[1, 2])."\n"; $a = [1, 2]; echo add(...$a); -?> ]]> &example.outputs; @@ -615,14 +611,17 @@ echo total_intervals('d', $a, $b).' days'; // これは失敗します。null は DateInterval オブジェクトではないからです。 echo total_intervals('d', null); -?> ]]> &example.outputs; @@ -655,7 +654,7 @@ Catchable fatal error: Argument 2 passed to total_intervals() must be an instanc 名前付き引数の文法 - + ]]> 位置を指定した引数と、名前付き引数 - + ]]> @@ -689,11 +686,10 @@ array_fill(start_index: 0, count: 100, value: 50); 上と同じ例を、引数の順番を変えて渡す - + ]]> @@ -707,13 +703,12 @@ array_fill(value: 50, count: 100, start_index: 0); 位置を指定した引数と、名前付き引数を組み合わせる - + ]]> @@ -724,7 +719,7 @@ htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, 'UTF-8', fa 同じ名前の引数を複数回渡すと、Error がスローされる - + ]]> @@ -759,7 +752,6 @@ var_dump(foo(...[1, 2], d: 40)); // 46 var_dump(foo(...['b' => 2, 'a' => 1], d: 40)); // 46 var_dump(foo(...[1, 2], b: 20)); // Fatal error. Named parameter $b overwrites previous argument -?> ]]> @@ -797,7 +789,6 @@ function square($num) return $num * $num; } echo square(4); // '16'を出力 -?> ]]> @@ -820,12 +811,11 @@ function small_numbers() } // 配列を展開させると、配列のそれぞれのメンバが個別に得られます。 [$zero, $one, $two] = small_numbers(); +var_dump($zero, $one, $two); // PHP 7.1.0 より前のバージョンで上と同じことをするには、 // 言語構造 list を使うしかありません。 list($zero, $one, $two) = small_numbers(); - -?> ]]> @@ -839,7 +829,7 @@ list($zero, $one, $two) = small_numbers(); 関数からリファレンスを返す - + ]]> @@ -887,12 +876,12 @@ $newref =& returns_reference(); \n"; + echo "In foo()\n"; } function bar($arg = '') { - echo "In bar(); argument was '$arg'.
\n"; + echo "In bar(); argument was '$arg'.\n"; } // これは、echo のラッパー関数です。 @@ -909,7 +898,6 @@ $func('test'); // This calls bar() $func = 'echoit'; $func('test'); // This calls echoit() -?> ]]> @@ -938,8 +926,6 @@ class Foo $foo = new Foo(); $funcname = "Variable"; $foo->$funcname(); // $foo->Variable() をコールする - -?> ]]> @@ -956,17 +942,22 @@ class Foo static $variable = 'static property'; static function Variable() { - echo 'Method Variable called'; + echo "Method Variable called\n"; } } -echo Foo::$variable; // これは 'static property' を表示します。このスコープにおいて $variable が必要です。 +echo Foo::$variable ."\n"; // これは 'static property' を表示します。このスコープにおいて $variable が必要です。 $variable = "Variable"; Foo::$variable(); // これは $foo->Variable() をコールします。このスコープでの $variable の内容を読むからです。 - -?> ]]> + &example.outputs; + + + @@ -993,7 +984,6 @@ $func = array(new Foo, "baz"); $func(); // "baz" を表示します $func = "Foo::bar"; $func(); // "bar" を表示します。 -?> ]]> @@ -1098,7 +1088,6 @@ var_dump(strlen(null)); var_dump(str_contains("foobar", null)); // "Deprecated: Passing null to parameter #2 ($needle) of type string is deprecated" as of PHP 8.1.0 // bool(true) -?> ]]> @@ -1141,7 +1130,6 @@ echo preg_replace_callback('~-([a-z])~', function ($match) { return strtoupper($match[1]); }, 'hello-world'); // helloWorld と出力します -?> ]]> @@ -1165,7 +1153,6 @@ $greet = function($name) { $greet('World'); $greet('PHP'); -?> ]]> @@ -1230,7 +1217,6 @@ $example = function () use ($message): string { return "hello $message"; }; var_dump($example()); -?> ]]> &example.outputs.similar; @@ -1315,7 +1301,6 @@ $my_cart->add('eggs', 6); // 合計に消費税 5% を付加した金額を表示します print $my_cart->getTotal(0.05) . "\n"; // 結果は 54.29 です -?> ]]> @@ -1325,7 +1310,6 @@ print $my_cart->getTotal(0.05) . "\n"; testing(); $function(); - -?> ]]> &example.outputs; @@ -1373,7 +1355,6 @@ object(Test)#1 (0) { ]]> &example.outputs; __construct() +#2 {main} + thrown in script on line 7 ]]> @@ -1405,20 +1388,22 @@ NULL bindTo(new stdClass); $func(); - -?> ]]> &example.outputs; @@ -1479,7 +1464,7 @@ Warning: Cannot bind an instance to a static closure in %s on line %d 無名関数とアロー関数は共に - Closure クラスを使って実装されています。 + Closure クラスを使って実装されています。 @@ -1505,9 +1490,8 @@ Warning: Cannot bind an instance to a static closure in %s on line %d $x + $y; // $y を値渡しするのと同じ $fn2 = function ($x) use ($y) { @@ -1515,7 +1499,6 @@ $fn2 = function ($x) use ($y) { }; var_export($fn1(3)); -?> ]]> &example.outputs; @@ -1535,12 +1518,10 @@ var_export($fn1(3)); fn($y) => $x * $y + $z; // 51 を出力 var_export($fn(5)(10)); -?> ]]> @@ -1554,18 +1535,15 @@ var_export($fn(5)(10)); アロー関数の例 - + $x; static fn($x): int => $x; fn($x = 42) => $x; fn(&$x) => $x; fn&($x) => $x; fn($x, ...$rest) => $rest; - -?> ]]> @@ -1583,13 +1561,10 @@ fn($x, ...$rest) => $rest; $x++; // 意味がない $fn(); var_export($x); // 1 を出力 - -?> ]]> @@ -1652,10 +1627,9 @@ var_export($x); // 1 を出力 PHP の文法上直接コールできるあらゆる式が使えます: 簡単な例 - + ]]> @@ -1703,7 +1676,6 @@ $f9 = [Foo::class, 'staticmethod'](...); + + + + + +getPrivateMethod(); $privateMethod(); // Foo1::privateMethod -?> ]]> - - - - + + @@ -1757,12 +1733,11 @@ $privateMethod(); // Foo1::privateMethod この記法は、nullsafe 演算子 と組み合わせて使うことはできません。 以下のコードは、いずれもコンパイルエラーになります: - + method(...); $obj?->prop->method(...); -?> ]]> diff --git a/language/namespaces.xml b/language/namespaces.xml index 02cacfcdd6..5e0feb82ea 100644 --- a/language/namespaces.xml +++ b/language/namespaces.xml @@ -1,10 +1,10 @@ - + + version="1.1" annotations="interactive"> 名前空間 @@ -62,16 +62,19 @@ function myfunction() {} const MYCONST = 1; $a = new MyClass; +print $a::class . "\n"; $c = new \my\name\MyClass; // "グローバル空間" を参照ください +print $c::class . "\n"; $a = strlen('hi'); // "名前空間の使用法: グローバル関数/定数への // 移行" を参照ください +print $a . "\n"; $d = namespace\MYCONST; // "namespace 演算子および __NAMESPACE__ 定数" // を参照ください +print $d . "\n"; $d = __NAMESPACE__ . '\MYCONST'; echo constant($d); // "名前空間および動的言語機能" を参照ください -?> ]]> @@ -103,7 +106,7 @@ echo constant($d); // "名前空間および動的言語機能" を参照くだ ただし キーワードは例外です。 名前空間の宣言 - + ]]> @@ -127,12 +128,11 @@ function connect() { /* ... */ } さらに、PHP コード以外であっても名前空間の宣言の前に記述することはできません (スペースも同様です)。 名前空間の宣言 - + ]]> @@ -151,7 +151,7 @@ namespace MyProject; // fatal error - namespace must be the first statement in t このようにして名前空間を定義します。 階層つきの名前空間の宣言 - + ]]> @@ -180,7 +178,7 @@ function connect() { /* ... */ } シンプルな組み合わせ方式による複数の名前空間の宣言 - + ]]> @@ -206,7 +203,7 @@ function connect() { /* ... */ } 波括弧構文による複数の名前空間の宣言 - + ]]> @@ -243,16 +239,22 @@ function connect() { /* ... */ } namespace MyProject { const CONNECT_OK = 1; -class Connection { /* ... */ } -function connect() { /* ... */ } +class Connection { + public static function start() { + print __METHOD__ . "\n"; + } +} + +function connect() { + print __FUNCTION__ . "\n"; +} } namespace { // グローバルコード -session_start(); -$a = MyProject\connect(); -echo MyProject\Connection::start(); +print strlen("hi") . "\n"; +MyProject\connect(); +MyProject\Connection::start(); } -?> ]]> @@ -264,20 +266,26 @@ echo MyProject\Connection::start(); ]]> @@ -361,7 +369,7 @@ echo MyProject\Connection::start(); これら 3 つの構文を実際のコードで使う例を次に示します。 file1.php - + ]]> file2.php - + ]]> @@ -424,10 +430,10 @@ function strlen() {} const INI_ALL = 3; class Exception {} -$a = \strlen('hi'); // グローバル関数 strlen をコールします -$b = \INI_ALL; // グローバル定数 INI_ALL にアクセスします +print \strlen('hi') . "\n"; // グローバル関数 strlen をコールします +print \INI_ALL . "\n"; // グローバル定数 INI_ALL にアクセスします $c = new \Exception('error'); // グローバルクラス Exception のインスタンスを作成します -?> +print $c::class . "\n"; ]]> @@ -464,7 +470,6 @@ $obj = new $a; // classname::__construct と表示します $b = 'funcname'; $b(); // funcname と表示します echo constant('constname'), "\n"; // global と表示します -?> ]]> @@ -501,7 +506,6 @@ $b = '\namespacename\funcname'; $b(); // これも namespacename\funcname と表示します echo constant('\namespacename\constname'), "\n"; // namespaced と表示します echo constant('namespacename\constname'), "\n"; // これも namespaced と表示します -?> ]]> @@ -532,7 +536,6 @@ echo constant('namespacename\constname'), "\n"; // これも namespaced と表 namespace MyProject; echo '"', __NAMESPACE__, '"'; // "MyProject" と出力します -?> ]]> @@ -541,9 +544,7 @@ echo '"', __NAMESPACE__, '"'; // "MyProject" と出力します ]]> @@ -551,7 +552,7 @@ echo '"', __NAMESPACE__, '"'; // "" と出力します たとえば次のようになります。 __NAMESPACE__ による動的な名前の作成 - + ]]> @@ -573,7 +573,7 @@ function get($classname) 演算子と同じ意味合いのものです。 名前空間内での namespace 演算子 - + ]]> グローバルコードでの namespace 演算子 - + ]]> @@ -627,7 +625,7 @@ $b = namespace\CONSTANT; // 定数 CONSTANT の値を $b に代入します ここに、5 種類すべてのインポート方法の例を示します。 use 演算子によるインポート/エイリアス - + ]]> @@ -670,14 +667,13 @@ echo CONSTANT; // 定数 My\Full\CONSTANT の値を表示します PHP では、複数の use 文を同一行に置くための便利なショートカットもサポートしています。 use 演算子によるインポート/エイリアスで、複数の use 文を組み合わせる例 - + ]]> @@ -686,7 +682,7 @@ NSname\subns\func(); // My\Full\NSname\subns\func 関数をコールします インポートはコンパイル時に行われるので、動的なクラス名、関数名や定数名には影響を及ぼしません。 インポートと動的名 - + ]]> @@ -704,7 +699,7 @@ $obj = new $a; // Another クラスのオブジェクトのインスタン 完全修飾名は絶対的なものであり、インポートの影響を受けることはありません。 インポートと完全修飾名 - + ]]> @@ -741,7 +735,6 @@ function toGreenlandic() // ... } -?> ]]> @@ -760,7 +753,7 @@ function toGreenlandic() それらをひとつの &use.namespace; にまとめることができます。 - + グローバル空間を指定する方法 - + ]]> @@ -832,10 +824,11 @@ namespace A\B\C; class Exception extends \Exception {} $a = new Exception('hi'); // $a は A\B\C\Exception クラスのオブジェクトです +var_dump($a::class); $b = new \Exception('hi'); // $b は Exception クラスのオブジェクトです +var_dump($b::class); $c = new ArrayObject; // fatal error, class A\B\C\ArrayObject not found -?> ]]> @@ -865,7 +858,6 @@ if (is_array('hi')) { // "is not array" と表示します } else { echo "is not array\n"; } -?> ]]> @@ -1011,7 +1003,7 @@ if (is_array('hi')) { // "is not array" と表示します 名前解決の例 - + ]]> @@ -1182,7 +1173,7 @@ A\B::foo(); // 名前空間 "A\A" のクラス "B" のメソッド "foo" を +print $a::class; ]]> @@ -1197,7 +1188,7 @@ $a = new \stdClass; +print $a::class; ]]> @@ -1213,14 +1204,16 @@ $a = new stdClass; +print MyException::class . "\n"; ]]> @@ -1241,19 +1234,21 @@ namespace foo; class MyClass {} // 現在の名前空間のクラスをパラメータの型として使う -function test(MyClass $parameter_type_example = null) {} +function test(?MyClass $parameter_type_example = null) {} // 現在の名前空間のクラスをパラメータの型として使うもうひとつの方法 -function test(\foo\MyClass $parameter_type_example = null) {} +function test2(?\foo\MyClass $parameter_type_example = null) {} // 現在の名前空間のクラスの継承 class Extended extends MyClass {} +print Extended::class . "\n"; // グローバル関数へのアクセス -$a = \globalfunc(); +$a = \strlen("test"); +print $a . "\n"; // グローバル定数へのアクセス $b = \INI_ALL; -?> +print $b . "\n"; ]]> @@ -1270,14 +1265,13 @@ $b = \INI_ALL; \ExceptionException となります。 完全修飾名 - + ]]> @@ -1300,7 +1294,7 @@ $a = \INI_ALL; // $a に定数 "INI_ALL" の値を設定します 修飾名 - + ]]> @@ -1332,7 +1325,7 @@ $a = my\BAR; // $a に定数 "foo\my\BAR" の値を設定します 非修飾クラス名 - + ]]> @@ -1373,8 +1365,12 @@ use blah\blah as foo; const FOO = 1; -function my() {} -function foo() {} +function my() { + print __FUNCTION__ . "\n"; +} +function foo() { + print __FUNCTION__ . "\n"; +} function sort(&$a) { \sort($a); // グローバル関数 "sort" をコールします @@ -1383,14 +1379,16 @@ function sort(&$a) } my(); // "foo\my" をコールします -$a = strlen('hi'); // "foo\strlen" が存在しないので、グローバル関数 "strlen" をコールします +print strlen('hi') . "\n"; // "foo\strlen" が存在しないので、グローバル関数 "strlen" をコールします $arr = array(1,3,2); $b = sort($arr); // "foo\sort" 関数をコールします -$c = foo(); // calls function "foo\foo" - import is not applied +var_dump($b); +foo(); // calls function "foo\foo" - import is not applied $a = FOO; // sets $a to value of constant "foo\FOO" - import is not applied +print $a; $b = INI_ALL; // sets $b to value of global constant "INI_ALL" -?> +print $b; ]]> @@ -1402,25 +1400,23 @@ $b = INI_ALL; // sets $b to value of global constant "INI_ALL" 次のようなスクリプトの組み合わせは、正当なものです。 file1.php - + ]]> another.php - + ]]> file2.php - + ]]> @@ -1441,14 +1436,13 @@ $a = new MyClass; // 名前空間 another のクラス "thing" のインスタ しかし、次の例は名前の衝突による致命的なエラーとなります。 MyClass の定義が同じファイル上の use 文で行われているからです。 - + ]]> @@ -1467,7 +1461,6 @@ namespace my\stuff { class foo {} } } -?> ]]> @@ -1479,7 +1472,6 @@ namespace my\stuff { namespace my\stuff\nested { class foo {} } -?> ]]> @@ -1493,7 +1485,7 @@ namespace my\stuff\nested { そうしないと、予期せぬ結果を引き起こしてしまいます。 ダブルクォートで囲んだ文字列内で名前空間名を扱う際の危険 - + ]]> @@ -1519,7 +1510,7 @@ $obj = new $a; それが未定義なら致命的なエラーが発生します。 未定義の定数 - + ]]> @@ -1546,7 +1536,6 @@ namespace bar; const NULL = 0; // 致命的なエラー const true = 'stupid'; // これも、致命的なエラー // etc. -?> ]]>