File: operators.xml

package info (click to toggle)
phpdoc 20020310-1
  • links: PTS
  • area: main
  • in suites: woody
  • size: 35,272 kB
  • ctags: 354
  • sloc: xml: 799,767; php: 1,395; cpp: 500; makefile: 200; sh: 140; awk: 51
file content (652 lines) | stat: -rw-r--r-- 20,410 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision: 1.15 $ -->
 <chapter id="language.operators">
  <title>演算子</title>
  <simpara>
  </simpara>
  
  <sect1 id="language.operators.arithmetic">
   <title>代数演算子</title>
   <simpara>
    学校で習った基礎代数を憶えていますか?
    この演算子はそれらと同様に動作します。
   </simpara>
   <table>
    <title>代数演算子</title>
    <tgroup cols="3">
     <thead>
      <row>
       <entry>例</entry>
       <entry>名前</entry>
       <entry>結果</entry>
      </row>
     </thead>
     <tbody>
      <row>
       <entry>$a + $b</entry>
       <entry>加算</entry>
       <entry>$a および $b の合計</entry>
      </row>
      <row>
       <entry>$a - $b</entry>
       <entry>減算</entry>
       <entry>$aと$bの差</entry>
      </row>
      <row>
       <entry>$a * $b</entry>
       <entry>乗算</entry>
        <entry>$aおよび$bの積</entry>
      </row>
      <row>
       <entry>$a / $b</entry>
       <entry>割算</entry>
        <entry>$aおよび$bの商</entry>
      </row>
      <row>
       <entry>$a % $b</entry>
       <entry>剰余</entry>
       <entry>$aを$bで割った余り</entry>
      </row>
     </tbody>
    </tgroup>
   </table>
   
   <simpara>
    2つのオペランドが整数の場合(または整数に変換された文字列の場合)、
    割算演算子 ("/") は整数値 (整数の割算の結果) を返します。
    オペランドのどちらかが実数値である場合、実数で割算が行われます。
   </simpara>
  </sect1>

  <sect1 id="language.operators.assignment">
   <title>代入演算子</title>
   <simpara>
    代入演算子の基本となるものは "=" です。この演算子に関して最初に思
    い付く意味は"等しい"であるかもしれません。しかし、そうではありませ
    ん。本当は、左オペランドに右オペランドの式の値を設定する("得て代入
    する")ことを意味します。
   </simpara>
   <para>
    代入式の値は、代入される値です。つまり、"$a = 3" の値は、3です。
    これにより、以下のようなトリッキーなことができるようになります。
    <informalexample>
     <programlisting role="php">
<![CDATA[
$a = ($b = 4) + 5; // $a は 9 に等しく、$b は 4 にセットされます。
]]>
     </programlisting>
    </informalexample>
   </para>
   <para>
    基本代入演算子に加えて、全てのバイナリ演算子および文字列演算子に関
    して「複合演算子」があります。この演算子により、式の値を使用し、式
    の結果にその値を設定することができます。例えば、
    <informalexample>
     <programlisting role="php">
<![CDATA[
$a = 3;
$a += 5; // $a を 8 にセットします。$a = $a + 5; と同じです。
$b = "Hello ";
$b .= "There!"; // $bを"Hello There!"にセットします。$b = $b . "There!";と同じです。
]]>
     </programlisting>
    </informalexample>
   </para>
   <para>
    代入は、元の変数を新しい変数にコピーする(値による代入)ため、
    片方の変数に対する変更はもう片方に影響を与えないということに注意し
    て下さい。この動作により、密なループの内側で大きな配列のようなもの
    をコピーする必要がある場合には問題を生じる可能性があります。
    PHP 4 では、<computeroutput>$var = &amp;$othervar;</computeroutput>
    構文により参照による代入をサポートしていますが、PHP 3 ではサポート
    しません。'参照による代入'は、両方の変数が同じデータを指し、コピー
    を行わないことを意味します。参照に関する詳細については、
    <link linkend="language.references">リファレンスの説明</link>も
    参照下さい。
   </para>
   </sect1>

  <sect1 id="language.operators.bitwise">
   <title>ビット演算子</title>
   <simpara>
    ビット演算子は、整数における特定のビットをオンまたはオフにすることを
    可能にします。もし左辺値と右辺値共に文字列であった場合にはビット演算子は
    文字に対して作用します。
   </simpara>
   <para>
    <informalexample>
     <programlisting>
<![CDATA[
<?php
    echo 12 ^ 9; // '5'を出力します

    echo "12" ^ "9"; // バックスペース文字を出力します(ascii 8)
                     // ('1' (ascii 49)) ^ ('9' (ascii 57)) = #8

    echo "hallo" ^ "hello"; // ascii値の #0 #4 #0 #0 #0 を出力します
                            // 'a' ^ 'e' = #4
?>
]]>
     </programlisting>
    </informalexample>
   </para>

   <table>
    <title>ビット演算子</title>
    <tgroup cols="3">
     <thead>
      <row>
       <entry>例</entry>
       <entry>名前</entry>
       <entry>結果</entry>
      </row>
     </thead>
     <tbody>
      <row>
       <entry>$a &amp; $b</entry>
       <entry>論理積</entry>
       <entry>
	$aおよび$bの両方にセットされているビット
       </entry>
      </row>
      <row>
       <entry>$a | $b</entry>
        <entry>論理和</entry>
       <entry>
	$aまたは$bのどちらかにセットされているビット
       </entry>
      </row>
      <row>
       <entry>$a ^ $b</entry>
       <entry>排他的論理和</entry>
       <entry>
	$aまたは$bにセットされており、両方にセットされていないビット
       </entry>
      </row>
      <row>
       <entry>~ $a</entry>
       <entry>否定</entry>
       <entry>
	$aにセットされているビットはセットせず、そうでないものは逆にする
       </entry>
      </row>
      <row>
       <entry>$a &lt;&lt; $b</entry>
       <entry>左シフト</entry>
       <entry>
	$a のビットを左に $b ビットシフトする(各シフトは "2をかける"こ
	とを意味します)
       </entry>
      </row>
      <row>
       <entry>$a &gt;&gt; $b</entry>
       <entry>右シフト</entry>
       <entry>
	$a のビットを右に $b ビットシフトします (各シフトは "2で割る"
	ことを意味します)
       </entry>
      </row>
     </tbody>
    </tgroup>
   </table>
  </sect1>
  
  <sect1 id="language.operators.comparison">
   <title>比較演算子</title>
   <simpara>
    比較演算子は、その名前が示すように、二つの値を比較します。
   </simpara>
   <table>
    <title>比較演算子</title>
    <tgroup cols="3">
     <thead>
      <row>
       <entry>例</entry>
       <entry>名前</entry>
       <entry>結果</entry>
      </row>
     </thead>
     <tbody>
      <row>
       <entry>$a == $b</entry>
       <entry>等しい</entry>
       <entry>$a が $b に等しい時に&true;。</entry>
      </row>
      <row>
       <entry>$a === $b</entry>
       <entry>等しい</entry>
       <entry>$a が $b に等しく同じ型でである場合に &true;。(PHP 4のみ)
       </entry>
      </row>
      <row>
       <entry>$a != $b</entry>
       <entry>等しくない</entry>
       <entry>$a が $b に等しくない場合に&true;。</entry>
      </row>
      <row>
       <entry>$a &lt;> $b</entry>
       <entry>等しくない</entry>
       <entry>$aが$bに等しくない場合に&true;</entry>
      </row>
      <row>
       <entry>$a !== $b</entry>
       <entry>等しくない</entry>
       <entry>
	$a が $b と等しくないか、同じ型でない場合に &true;。(PHP 4のみ)
       </entry>
      </row>
      <row>
       <entry>$a &lt; $b</entry>
       <entry>より少ない</entry>
       <entry>$a が $b より少ない時に&true;。</entry>
      </row>
      <row>
       <entry>$a &gt; $b</entry>
       <entry>より多い</entry>
       <entry>$a が $b より多い時に&true;。</entry>
      </row>
      <row>
       <entry>$a &lt;= $b</entry>
       <entry>より少ないか等しい</entry>
       <entry>$a が $b より少ないか等しい時に&true;。</entry>
      </row>
      <row>
       <entry>$a &gt;= $b</entry>
       <entry>より多いか等しい</entry>
       <entry>$a が $b より多いか等しい時に&true;。</entry>
      </row>
     </tbody>
    </tgroup>
   </table>
   <para>
    条件演算子としては、他に "?:" (または trinary) 演算子があります。
    この演算子の動作は、Cまたは他の多く言語と同じです。
    <informalexample>
     <programlisting>
<![CDATA[
     (式1) ? (式2) : (式3);
]]>
     </programlisting>
    </informalexample>
    この式は、<replaceable>式1</replaceable> が&true;の場合に
    <replaceable>式2</replaceable> を、
    <replaceable>式1</replaceable> が&false;の場合に
    <replaceable>式3</replaceable> を値とします。
   </para>
  </sect1>
 
  <sect1 id="language.operators.errorcontrol">
   <title>エラー制御演算子</title>
   <simpara>
    PHPは、エラー制御演算子(@)をサポートしています。PHPの式の前に付け
    た場合、その式により生成されたエラーメッセージは無視されます。
   </simpara>
   <simpara>
    <link linkend="ini.track-errors">track_errors</link>機能が有効の場
    合、式により生成されたエラーメッセージはグローバル変数
    $php_errormsgに保存されます。この変数は、誤差発生の度に上書きされ、
    このため、この変数を使用したい場合には速やかに確認する必要がありま
    す。
   </simpara>
   <para>
    <informalexample>
     <programlisting role="php">
<![CDATA[
<?php
/* 意図的なエラー */
$my_file = @file ('non_existent_file') or
    die ("Failed opening file: error was '$php_errormsg'");

// この演算子は関数だけでなく、全ての式で動作します。
$value = @$cache[$key]; 
// インデックス $key が存在しない場合でも、警告を発生しません。

?>
]]>
     </programlisting>
    </informalexample>
   </para>
   <note>
    <simpara>
     @演算子は、式でのみ動作します。基本的なルールは次のようになります。
     値を得ることができるものの場合、@演算子を前に付けることが可能です。
     例えば、変数、関数、<function>include</function>コール、定数等の
     前にこの演算子をつけることが可能です。関数またはクラスの定義や
     <literal>if</literal>や<literal>foreach</literal>等のような条件構
     造の前にこの演算子を付けることはできません。
    </simpara>
   </note>
   <note>
    <simpara>
     多くのデータベース関数はPHPエラーを返しさないため、使用するデータ
     ベース型に適用可能なget_error()関数を使用する必要があります。
    </simpara>
   </note>
   <simpara>
    <function>error_reporting</function>も参照下さい。
   </simpara>
   <warning>
    <para>
     現在、誤差制御演算子プレフィックス"@"は、スクリプトの実行を終了す
     るような致命的なエラーの出力さえ抑圧します。このため、ある関数の
     エラー出力を抑制するために "@" を使用した場合、その関数が利用でき
     なかったり、ミスタイプがあった場合でも、原因を示すことなくその場
     所でスクリプトは終了してしまいます。
    </para>
   </warning>
  </sect1>
  
  <sect1 id="language.operators.execution">
   <title>実行演算子</title>
   <para>
    PHP は1種類の実行演算子、バッククォート (``) をサポートします。シ
    ングルクォートではないことに注意してください!PHP は、後方引用符の
    中身をシェルコマンドとして実行しようとします。出力が返されます。
    (すなわち、出力を単にダンプするのではなく、変数に代入することがで
    きます。)
    <informalexample>
     <programlisting role="php">
<![CDATA[
$output = `ls -al`;
echo "<pre>$output</pre>";
]]>
     </programlisting>
    </informalexample>
   </para>
   <note>
    <para>
     バッククオート演算子は、<link linkend="ini.safe-mode">セーフモー
	 ド</link> が有効な場合、もしくは<function>shell_exec</function>
	 が無効な場合は無効となります。
    </para>
   </note>
   <para>
    <function>escapeshellcmd</function>, <function>exec</function>,
	<function>passthru</function>, <function>popen</function>,
    <function>popen</function>, 
	<function>shell_exec</function>, <function>system</function>
	も参照して下さい。
   </para>
  </sect1>
   
  <sect1 id="language.operators.increment">
   <title>加算子/減算子</title>
   <para>
    PHP はC言語形式を前置および後置の加算子および減算子をサポートします。
   </para>
   <table>
    <title>加算子/減算子</title>
    <tgroup cols="3">
     <thead>
      <row>
       <entry>例</entry>
       <entry>名前</entry>
       <entry>効果</entry>
      </row>
     </thead>
     <tbody>
      <row>
       <entry>++$a</entry>
       <entry>前置加算子</entry>
       <entry>$a に1を加え、$a を返します。</entry>
      </row>
      <row>
       <entry>$a++</entry>
       <entry>後置加算子</entry>
       <entry>$a を返し、$a に1を加えます。</entry>
      </row>
      <row>
       <entry>--$a</entry>
       <entry>前置減算子</entry>
       <entry>$a から1を引き、$a を返します。</entry>
      </row>
      <row>
       <entry>$a--</entry>
       <entry>後置減算子</entry>
       <entry>$aを返し、$a から1を引きます。</entry>
      </row>
     </tbody>
    </tgroup>
   </table>
   <para>
    以下に簡単なスクリプトの例を示します。
    <informalexample>
     <programlisting role="php">
<![CDATA[
<?php
echo "<h3>後置加算</h3>";
$a = 5;
echo "5となります: " . $a++ . "<br>\n";
echo "6となります: " . $a . "<br>\n";
 
echo "<h3>前置加算</h3>";
$a = 5;
echo "6となります: " . ++$a . "<br>\n";
echo "6となります: " . $a . "<br>\n";

echo "<h3>後置減算</h3>";
$a = 5;
echo "5となります: " . $a-- . "<br>\n";
echo "4となります: " . $a . "<br>\n";

echo "<h3>前置減算</h3>";
$a = 5;
echo "4となります: " . --$a . "<br>\n";
echo "4となります: " . $a . "<br>\n";
?>
]]>
     </programlisting>
    </informalexample>
   </para>
  </sect1>
 
  <sect1 id="language.operators.logical">
   <title>論理演算子</title>
 
   <table>
    <title>論理演算子</title>
    <tgroup cols="3">
     <thead>
      <row>
       <entry>例</entry>
       <entry>名前</entry>
       <entry>結果</entry>
      </row>
     </thead>
     <tbody>
      <row>
       <entry>$a and $b</entry>
       <entry>論理積</entry>
       <entry>$a および $b が共に &true; の場合に &true;</entry>
      </row>
      <row>
       <entry>$a or $b</entry>
       <entry>論理和</entry>
       <entry>$a または $b のどちらかが &true; の場合に &true;</entry>
      </row>
      <row>
       <entry>$a xor $b</entry>
       <entry>排他的論理和</entry>
       <entry>
	$aまたは$bのどちらかが&true;でかつ両方とも&true;でない場合に&true;
       </entry>
      </row>
      <row>
       <entry>! $a</entry>
       <entry>否定</entry>
       <entry>$a が &true; でない場合 &true;</entry>
      </row>
      <row>
       <entry>$a &amp;&amp; $b</entry>
       <entry>論理積</entry>
       <entry>$a および $b が共に &true; の場合に &true;</entry>
      </row>
      <row>
       <entry>$a || $b</entry>
       <entry>論理和</entry>
       <entry>$a または $b のどちらかが &true; の場合に &true;</entry>
      </row>
     </tbody>
    </tgroup>
   </table>
   <simpara>
    "and" および "or" 演算子が2種類あるのは、演算が行われる際の優先順
    位が異なっているためです。
    (<link linkend="language.operators.precedence">演算子の優先順位</link>
    を参照下さい。)
   </simpara>
  </sect1>

  <sect1 id="language.operators.precedence">
   <title>演算子の優先順位</title>
   <para>
    演算子の優先順位は、二つの式が"緊密に"結合している度合いを指定します。
    例えば、式 <literal>1 + 5 * 3</literal> の答えは
    <literal>16</literal>になり、<literal>18</literal>とはなりません。
    これは乗算演算子("*")は、加算演算子("+")より高い優先順位を有するか
    らです。必要に応じて強制的に優先順位を設定するために括弧を使用する
    ことが可能です。例えば、<literal>18</literal>と評価するためには、
    <literal>(1 + 5) * 3</literal> とします。
   </para>
   <para>
    次の表に示すリストは優先順位が最低ものから並べた演算子の優先順位です。
    <table>
     <title>演算子の優先順位</title>
     <tgroup cols="2">
      <thead>
       <row>
        <entry>結合時の評価</entry>
        <entry>演算子</entry>
       </row>
      </thead>
      <tbody>
       <row>
        <entry>左</entry>
        <entry>,</entry>
       </row>
       <row>
        <entry>左</entry>
        <entry>or</entry>
       </row>
       <row>
        <entry>左</entry>
        <entry>xor</entry>
       </row>
       <row>
        <entry>左</entry>
        <entry>and</entry>
       </row>
       <row>
        <entry>右</entry>
        <entry>print</entry>
       </row>
       <row>
        <entry>左</entry>
	<entry>= += -= *= /= .= %= &amp;= |= ^= ~= &lt;&lt;= &gt;&gt;=</entry>
       </row>
       <row>
        <entry>左</entry>
        <entry>? :</entry>
       </row>
       <row>
        <entry>左</entry>
        <entry>||</entry>
       </row>
       <row>
        <entry>左</entry>
        <entry>&amp;&amp;</entry>
       </row>
       <row>
        <entry>左</entry>
        <entry>|</entry>
       </row>
       <row>
        <entry>左</entry>
        <entry>^</entry>
       </row>
       <row>
        <entry>左</entry>
        <entry>&amp;</entry>
       </row>
       <row>
        <entry>結合しない</entry>
        <entry>== != === !==</entry>
       </row>
       <row>
        <entry>結合しない</entry>
        <entry>&lt; &lt;= &gt; &gt;=</entry>
       </row>
       <row>
        <entry>左</entry>
        <entry>&lt;&lt; &gt;&gt;</entry>
       </row>
       <row>
        <entry>左</entry>
        <entry>+ - .</entry>
       </row>
       <row>
        <entry>左</entry>
        <entry>* / %</entry>
       </row>
       <row>
        <entry>右</entry>
        <entry>! ~ ++ -- (int) (double) (string) (array) (object) @</entry>
       </row>
       <row>
        <entry>右</entry>
        <entry>[</entry>
       </row>
       <row>
        <entry>結合しない</entry>
        <entry>new</entry>
       </row>
      </tbody>
     </tgroup>
    </table>
   </para>
  </sect1>
  
  <sect1 id="language.operators.string">
   <title>文字列演算子</title>
   <simpara>
    文字列の演算子は2種類あります。最初のは結合演算子('.')で、右引数と
    左引数を結合したものを返します。2番目は、結合代入演算子('.=')で、
    この演算子は右側の引数に左側の引数を追加します。詳細は、<link
    linkend="language.operators.assignment">代入演算子</link> を参照下
    さい。
   </simpara>

   <para>
    <informalexample>
     <programlisting role="php">
<![CDATA[
$a = "Hello ";
$b = $a . "World!"; // $b は、"Hello World!" となります。

$a = "Hello ";
$a .= "World!"; // $a は、"Hello World!" となります。
]]>
     </programlisting>
    </informalexample>
   </para>
  </sect1>
  
 </chapter>
 
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->