1
1
<?xml version =" 1.0" encoding =" utf-8" ?>
2
2
<!-- $Revision$ -->
3
- <!-- EN-Revision: 5c2678e02f0eb135946799eed02d884de1bcf4ad Maintainer: takagi Status: ready -->
3
+ <!-- EN-Revision: 0bafd5454e7c54de5b9e455f997bec3ecf89cfdb Maintainer: takagi Status: ready -->
4
4
<!-- CREDITS: hirokawa,mumumu -->
5
5
<chapter xml : id =" language.functions" xmlns =" http://docbook.org/ns/docbook" >
6
6
<title >関数</title >
@@ -229,29 +229,6 @@ function takes_many_args(
229
229
// ...
230
230
}
231
231
?>
232
- ]]>
233
- </programlisting >
234
- </example >
235
- <para >
236
- PHP 8.0.0 以降では、オプションの引数の後に、
237
- 必須の引数を続けて宣言することは、
238
- 推奨されなくなります。
239
- 一般的には、デフォルト値を削除することで解決できます。
240
- このルールの唯一の例外は、<code >Type $param = null</code > と書かれた引数です。
241
- null をデフォルトにすることは、型が暗黙のうちに nullable であることを示しています。
242
- この書き方はまだ許可されていますが、明示的に nullable 型を使うことを推奨します。
243
- </para >
244
- <example >
245
- <title >オプションの引数の後に、必須の引数を続けて宣言する</title >
246
- <programlisting role =" php" >
247
- <![CDATA[
248
- <?php
249
- function foo($a = [], $b) {} // PHP 8.0.0 より前
250
- function foo($a, $b) {} // PHP 8.0.0 以後
251
-
252
- function bar(A $a = null, $b) {} // PHP 8.0.0 でもまだ許可されています
253
- function bar(?A $a, $b) {} // お勧めの書き方
254
- ?>
255
232
]]>
256
233
</programlisting >
257
234
</example >
@@ -296,12 +273,15 @@ echo $str; // 出力は 'This is a string, and something extra.' となりま
296
273
<title >デフォルト引数値</title >
297
274
298
275
<para >
299
- 関数は、スカラー引数に関して次のように C++ スタイルのデフォルト値を
300
- 定義することができます。
276
+ 関数は、変数に代入する記法に似たやり方で、
277
+ デフォルト値を引数に定義することができます。
278
+ デフォルト値は引数が指定されなかった場合に使われますが、
279
+ &null; を渡した場合はデフォルト値を代入
280
+ <emphasis >しない</emphasis > ことに特に注意して下さい。
301
281
</para >
302
282
<para >
303
283
<example >
304
- <title >関数におけるデフォルトパラメータの使用法 </title >
284
+ <title >関数におけるデフォルト引数の使用法 </title >
305
285
<programlisting role =" php" >
306
286
<![CDATA[
307
287
<?php
@@ -326,8 +306,11 @@ Making a cup of espresso.
326
306
</example >
327
307
</para >
328
308
<para >
329
- PHPでは、配列および特殊な型 &null; をデフォルト値とすることも可能です。
330
- 例えば、
309
+ デフォルト引数の値には、スカラー値、
310
+ 配列、および特殊な型 &null; を指定できます。
311
+ PHP 8.1.0 以降では、
312
+ <link linkend =" language.oop5.basic.new" >new ClassName()</link >
313
+ 記法を使ってオブジェクトも指定できます。
331
314
</para >
332
315
<para >
333
316
<example >
@@ -341,44 +324,69 @@ function makecoffee($types = array("cappuccino"), $coffeeMaker = NULL)
341
324
return "Making a cup of ".join(", ", $types)." with $device.\n";
342
325
}
343
326
echo makecoffee();
344
- echo makecoffee(array("cappuccino", "lavazza"), "teapot");
327
+ echo makecoffee(array("cappuccino", "lavazza"), "teapot");?>
328
+ ]]>
329
+ </programlisting >
330
+ </example >
331
+ </para >
332
+ <para >
333
+ <example >
334
+ <title >オブジェクトをデフォルト値として使用する(PHP 8.1.0 以降)</title >
335
+ <programlisting role =" php" >
336
+ <![CDATA[
337
+ <?php
338
+ class DefaultCoffeeMaker {
339
+ public function brew() {
340
+ return 'Making coffee.';
341
+ }
342
+ }
343
+ class FancyCoffeeMaker {
344
+ public function brew() {
345
+ return 'Crafting a beautiful coffee just for you.';
346
+ }
347
+ }
348
+ function makecoffee($coffeeMaker = new DefaultCoffeeMaker)
349
+ {
350
+ return $coffeeMaker->brew();
351
+ }
352
+ echo makecoffee();
353
+ echo makecoffee(new FancyCoffeeMaker);
345
354
?>
346
355
]]>
347
356
</programlisting >
348
357
</example >
349
-
350
358
</para >
351
359
<simpara >
352
360
デフォルト値は、定数式である必要があり、
353
361
(例えば) 変数やクラスのメンバーであってはなりません。
354
362
</simpara >
355
363
<para >
356
- 引数のデフォルト値を使用する際には、デフォルト値を有する引数はデ
357
- フォルト値がない引数の右側に全てある必要があることに注意して下さ
358
- い。そうでない場合、意図したような動作が行われません。次の簡単な
359
- コードを見てみましょう。
364
+ デフォルト値を有する引数は、
365
+ デフォルト値がない引数の右側に全てある必要があることに注意して下さい。
366
+ そうでない場合、デフォルト値を指定していても、
367
+ 呼び出し時に省略できません。
368
+ 次の簡単なコードを見てみましょう。
360
369
</para >
361
370
<para >
362
371
<example >
363
372
<title >関数の引数のデフォルト値の 間違った使用法</title >
364
373
<programlisting role =" php" >
365
374
<![CDATA[
366
375
<?php
367
- function makeyogurt($type = "acidophilus ", $flavour)
376
+ function makeyogurt($container = "bowl ", $flavour)
368
377
{
369
- return "Making a bowl of $type $ flavour.\n";
378
+ return "Making a $container of $flavour yogurt .\n";
370
379
}
371
380
372
- echo makeyogurt("raspberry"); // 期待通りには動作しません 。
381
+ echo makeyogurt("raspberry"); // $container に "raspberry" を指定します。$flavour ではありません 。
373
382
?>
374
383
]]>
375
384
</programlisting >
376
385
&example.outputs;
377
386
<screen >
378
387
<![CDATA[
379
- Warning: Missing argument 2 in call to makeyogurt() in
380
- /usr/local/etc/httpd/htdocs/phptest/functest.html on line 41
381
- Making a bowl of raspberry .
388
+ Fatal error: Uncaught ArgumentCountError: Too few arguments
389
+ to function makeyogurt(), 1 passed in example.php on line 42
382
390
]]>
383
391
</screen >
384
392
</example >
@@ -392,23 +400,90 @@ Making a bowl of raspberry .
392
400
<programlisting role =" php" >
393
401
<![CDATA[
394
402
<?php
395
- function makeyogurt($flavour, $type = "acidophilus ")
403
+ function makeyogurt($flavour, $container = "bowl ")
396
404
{
397
- return "Making a bowl of $type $ flavour.\n";
405
+ return "Making a $container of $flavour yogurt .\n";
398
406
}
399
407
400
- echo makeyogurt("raspberry"); // 期待通り動作します
408
+ echo makeyogurt("raspberry"); // $flavour に "raspberry" を指定します。
401
409
?>
402
410
]]>
403
411
</programlisting >
404
412
&example.outputs;
405
413
<screen >
406
414
<![CDATA[
407
- Making a bowl of acidophilus raspberry.
415
+ Making a bowl of raspberry yogurt .
408
416
]]>
409
417
</screen >
410
418
</example >
411
419
</para >
420
+ <para >
421
+ PHP 8.0.0 以降では、
422
+ デフォルト値を指定した引数を複数スキップするために、
423
+ <link linkend =" functions.named-arguments" >名前付き引数</link >
424
+ が使えます。
425
+ </para >
426
+ <para >
427
+ <example >
428
+ <title >関数の引数のデフォルト値の 正しい使用法</title >
429
+ <programlisting role =" php" >
430
+ <![CDATA[
431
+ <?php
432
+ function makeyogurt($container = "bowl", $flavour = "raspberry", $style = "Greek")
433
+ {
434
+ return "Making a $container of $flavour $style yogurt.\n";
435
+ }
436
+
437
+ echo makeyogurt(style: "natural");
438
+ ?>
439
+ ]]>
440
+ </programlisting >
441
+ &example.outputs;
442
+ <screen >
443
+ <![CDATA[
444
+ Making a bowl of raspberry natural yogurt.
445
+ ]]>
446
+ </screen >
447
+ </example >
448
+ </para >
449
+ <para >
450
+ PHP 8.0.0 以降では、
451
+ デフォルト値を指定した引数の後に、
452
+ 必須の引数を宣言することは <emphasis >推奨されません</emphasis >。
453
+ なぜなら、そのデフォルト値は絶対に使われないからです。
454
+ これは、デフォルト値を削除することで解決できます。
455
+ このルールの唯一の例外は、
456
+ <code >Type $param = null</code > と書かれた引数です。
457
+ &null; をデフォルトにすることは、
458
+ 型が暗黙のうちに nullable であることを示しています。
459
+ この書き方はまだ許可されていますが、
460
+ 以下のようにして 明示的に
461
+ <link linkend =" language.types.declarations.nullable" >nullable 型</link >
462
+ を使うことを推奨します:
463
+ <example >
464
+ <title >デフォルト値を指定した引数は、必須の引数の後に宣言する</title >
465
+ <programlisting role =" php" >
466
+ <![CDATA[
467
+ <?php
468
+ function foo($a = [], $b) {} // デフォルト値が使われないため、PHP 8.0.0 以降は推奨されません
469
+ function foo($a, $b) {} // 上のコードと機能的には同じですが、推奨されない警告は発生しません。
470
+
471
+ function bar(A $a = null, $b) {} // まだ許可されています。$a は必須ですが、nullable です。
472
+ function bar(?A $a, $b) {} // 推奨される書き方です。
473
+ ?>
474
+ ]]>
475
+ </programlisting >
476
+ </example >
477
+ </para >
478
+ <note >
479
+ <simpara >
480
+ PHP 7.1.0 以降では、
481
+ デフォルト値を指定しないで引数を省略すると、
482
+ <classname >ArgumentCountError</classname >
483
+ がスローされるようになりました。
484
+ これより前のバージョンでは、警告が発生していました。
485
+ </simpara >
486
+ </note >
412
487
<note >
413
488
<simpara >
414
489
リファレンス渡しの引数にもデフォルト値を指定できます。
@@ -604,7 +679,7 @@ echo sum(1, 2, 3, 4);
604
679
<example >
605
680
<title >名前付き引数の文法</title >
606
681
<programlisting role =" php" >
607
- <![CDATA[
682
+ <![CDATA[
608
683
<?php
609
684
myFunction(paramName: $value);
610
685
array_foobar(array: $value);
@@ -619,7 +694,7 @@ function_name($variableStoringParamName: $value);
619
694
<example >
620
695
<title >位置を指定した引数と、名前付き引数</title >
621
696
<programlisting role =" php" >
622
- <![CDATA[
697
+ <![CDATA[
623
698
<?php
624
699
// 位置を指定した引数の場合:
625
700
array_fill(0, 100, 50);
@@ -638,7 +713,7 @@ array_fill(start_index: 0, count: 100, value: 50);
638
713
<example >
639
714
<title >上と同じ例を、引数の順番を変えて渡す</title >
640
715
<programlisting role =" php" >
641
- <![CDATA[
716
+ <![CDATA[
642
717
<?php
643
718
array_fill(value: 50, count: 100, start_index: 0);
644
719
?>
@@ -656,7 +731,7 @@ array_fill(value: 50, count: 100, start_index: 0);
656
731
<example >
657
732
<title >位置を指定した引数と、名前付き引数を組み合わせる</title >
658
733
<programlisting role =" php" >
659
- <![CDATA[
734
+ <![CDATA[
660
735
<?php
661
736
htmlspecialchars($string, double_encode: false);
662
737
// 上記は、以下と同等です。
@@ -671,9 +746,9 @@ htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, 'UTF-8', fa
671
746
</para >
672
747
673
748
<example >
674
- <title >同じ引数を複数回渡すと、Error 例外が発生する </title >
749
+ <title >同じ引数を複数回渡すと、Error がスローされる </title >
675
750
<programlisting role =" php" >
676
- <![CDATA[
751
+ <![CDATA[
677
752
<?php
678
753
function foo($param) { ... }
679
754
0 commit comments