cvs: phpdoc-ja /language basic-syntax.xml constants.xml control-structures.xml expressions.xml functions.xml oop.xml operators.xml references.xml
types.xml variables.xml

From: Date: Sun, 31 Jul 2005 00:57:12 +0000
Subject: cvs: phpdoc-ja /language basic-syntax.xml constants.xml control-structures.xml expressions.xml functions.xml oop.xml operators.xml references.xml
types.xml variables.xml
Groups: php.doc.ja 
Request: Send a blank email to doc-ja+get-1094@lists.php.net to get a copy of this message
takagi Sat Jul 30 20:57:12 2005 EDT Modified files: /phpdoc-ja/language variables.xml types.xml references.xml operators.xml oop.xml functions.xml expressions.xml control-structures.xml constants.xml basic-syntax.xml Log: sync with en.

http://cvs.php.net/diff.php/phpdoc-ja/language/variables.xml?r1=1.25&r2=1.26&ty=u Index: phpdoc-ja/language/variables.xml diff -u phpdoc-ja/language/variables.xml:1.25 phpdoc-ja/language/variables.xml:1.26 --- phpdoc-ja/language/variables.xml:1.25 Sun Jan 2 02:23:26 2005 +++ phpdoc-ja/language/variables.xml Sat Jul 30 20:57:06 2005 @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- $Revision: 1.25 $ --> -<!-- EN-Revision: 1.83 Maintainer: hirokawa Status: ready --> +<!-- $Revision: 1.26 $ --> +<!-- EN-Revision: 1.87 Maintainer: hirokawa Status: ready --> +<!-- CREDITS: takagi --> <chapter id="language.variables"> <title>変数</title> @@ -37,8 +38,8 @@ <informalexample> <programlisting role="php"> <![CDATA[ -$var = "Bob"; -$Var = "Joe"; +$var = 'Bob'; +$Var = 'Joe'; echo "$var, $Var"; // "Bob, Joe"を出力します。 $4site = 'not yet'; // 無効:数字で始まっている。 @@ -228,7 +229,7 @@ <term><link linkend="reserved.variables.get">$_GET</link></term> <listitem> <simpara> - HTTP GETによりスクリプトに入力された変数。以前の + URL クエリ文字列によりスクリプトに入力された変数。以前の (まだ利用可能ですが、推奨されません) <varname>$HTTP_GET_VARS</varname>配列に類似のものです。 </simpara> @@ -333,7 +334,7 @@ <![CDATA[ <?php $a = 1; -include "b.inc"; +include 'b.inc'; ?> ]]> </programlisting> @@ -424,7 +425,7 @@ function Sum() { - $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"]; + $GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b']; } Sum(); @@ -445,7 +446,7 @@ </simpara> <para> <example> - <title>Example demonstrating superglobals and scope</title> + <title>スーパーグローバルとスコープの例</title> <programlisting role="php"> <![CDATA[ <?php @@ -460,6 +461,7 @@ // スーパーグローバルはどのスコープでも有効であり // 'global'をコールする必要がありません。 // スーパーグローバルはPHP4.1.0以降で利用できます。 + // HTTP_POST_VARS は今や非推奨とされています。 echo $_POST['name']; } ?> @@ -470,7 +472,7 @@ </sect2> <sect2 id="language.variables.scope.static"> - <title>Using static variables</title> + <title>静的変数の使用</title> <simpara> 変数のスコープに関する別の重要な機能は、<emphasis>静的 (static)</emphasis> 変数です。静的変数はローカル関数スコープのみに @@ -479,11 +481,12 @@ </simpara> <para> <example> - <title>Example demonstrating need for static variables</title> + <title>静的変数が必要な場面の例</title> <programlisting role="php"> <![CDATA[ <?php -function Test() { +function Test() +{ $a = 0; echo $a; $a++; @@ -503,11 +506,12 @@ </simpara> <para> <example> - <title>Example use of static variables</title> + <title>静的変数の使用例</title> <programlisting role="php"> <![CDATA[ <?php -function Test() { +function Test() +{ static $a = 0; echo $a; $a++; @@ -533,11 +537,12 @@ </simpara> <para> <example> - <title>Static variables with recursive functions</title> + <title>再帰関数での静的変数の使用</title> <programlisting role="php"> <![CDATA[ <?php -function Test() { +function Test() +{ static $count = 0; $count++; @@ -555,20 +560,20 @@ <note> <para> - Static variables maybe declared as seen in the examples above. - Trying to assign values to these variables which are the - result of expressions will cause a parse error. + 静的変数は、上の例に見られるような方法で宣言されます。 + 式の結果を静的変数に代入しようとすると、パースエラーが + 発生します。 </para> <para> <example> - <title>Declaring static variables</title> + <title>静的変数の宣言</title> <programlisting role="php"> <![CDATA[ <?php function foo(){ - static $int = 0; // correct - static $int = 1+2; // wrong (as it is an expression) - static $int = sqrt(121); // wrong (as it is an expression too) + static $int = 0; // 正しい + static $int = 1+2; // 間違い(式を代入しています) + static $int = sqrt(121); // 間違い(同じく式を代入しています) $int++; echo $int; @@ -582,7 +587,7 @@ </sect2> <sect2 id="language.variables.scope.references"> - <title>References with global and static variables</title> + <title>グローバル変数と静的変数のリファレンス</title> <simpara> <literal>PHP4</literal>を駆動するZend Engine 1では、 リファレンス変数の修正子 @@ -640,7 +645,7 @@ function &get_instance_ref() { static $obj; - echo "Static object: "; + echo 'Static object: '; var_dump($obj); if (!isset($obj)) { // Assign a reference to the static variable @@ -653,7 +658,7 @@ function &get_instance_noref() { static $obj; - echo "Static object: "; + echo 'Static object: '; var_dump($obj); if (!isset($obj)) { // Assign the object to the static variable @@ -709,7 +714,7 @@ <programlisting role="php"> <![CDATA[ <?php -$a = "hello"; +$a = 'hello'; ?> ]]> </programlisting> @@ -725,7 +730,7 @@ <programlisting role="php"> <![CDATA[ <?php -$$a = "world"; +$$a = 'world'; ?> ]]> </programlisting> @@ -992,8 +997,8 @@ <programlisting role="php"> <![CDATA[ <?php - setcookie("MyCookie[foo]", "Testing 1", time()+3600); - setcookie("MyCookie[bar]", "Testing 2", time()+3600); + setcookie("MyCookie[foo]", 'Testing 1', time()+3600); + setcookie("MyCookie[bar]", 'Testing 2', time()+3600); ?> ]]> </programlisting> @@ -1026,7 +1031,7 @@ } else { $count = 1; } -setcookie("count", $count, time()+3600); +setcookie('count', $count, time()+3600); setcookie("Cart[$count]", $item, time()+3600); ?> ]]> http://cvs.php.net/diff.php/phpdoc-ja/language/types.xml?r1=1.36&r2=1.37&ty=u Index: phpdoc-ja/language/types.xml diff -u phpdoc-ja/language/types.xml:1.36 phpdoc-ja/language/types.xml:1.37 --- phpdoc-ja/language/types.xml:1.36 Sun Jan 2 02:23:26 2005 +++ phpdoc-ja/language/types.xml Sat Jul 30 20:57:07 2005 @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- $Revision: 1.36 $ --> -<!-- EN-Revision: 1.144 Maintainer: hirokawa Status: ready --> +<!-- $Revision: 1.37 $ --> +<!-- EN-Revision: 1.153 Maintainer: hirokawa Status: ready --> +<!-- CREDITS: takagi --> <chapter id="language.types"> <title>型</title> @@ -379,14 +380,14 @@ </para> <warning> <para> - If invalid digit is passed to octal integer (i.e. 8 or 9), the rest of - the number is ignored. + 8 進数の整数値として不正な数字(例: 8 または 9)が渡された場合、 + 数値の残りの部分は無視されます。 <example> - <title>Octal weirdness</title> + <title>おかしな 8 進数</title> <programlisting role="php"> <![CDATA[ <?php -var_dump(01090); // 010 octal = 8 decimal +var_dump(01090); // 010(8 進数)= 8(10 進数) ?> ]]> </programlisting> @@ -414,9 +415,9 @@ var_dump($large_number); // 出力: float(2147483648) -// 指定した16進表現整数も出力 -var_dump( 0x80000000 ); -// 出力: float(2147483648) +// 指定した16進表現整数を出力できない +var_dump( 0x100000000 ); +// 出力: int(2147483647) $million = 1000000; $large_number = 50000 * $million; @@ -561,10 +562,12 @@ </informalexample> 規約: <informalexample> - <programlisting> + <programlisting role="php"> +<![CDATA[ LNUM [0-9]+ DNUM ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*) EXPONENT_DNUM ( ({LNUM} | {DNUM}) [eE][+-]? {LNUM}) +]]> </programlisting> </informalexample> floatの大きさはプラットフォーム依存です。ただし、通常はおよそ10 @@ -807,6 +810,24 @@ 適当な終了IDがみつからない場合、スクリプトの最終行を発生 行とするパースエラーが発生します。 </simpara> + <para> + ヒアドキュメント構文を、クラスのメンバの初期化に用いることはできません。 + 他の文字列構文を利用してください。 + <example> + <title>間違った例</title> + <programlisting role="php"> +<![CDATA[ +<?php +class foo { + public $bar = <<<EOT +bar +EOT; +} +?> +]]> + </programlisting> + </example> + </para> </warning> <para> @@ -1282,10 +1303,11 @@ <varname>key</varname> は、<type>整数</type> または <type>文字列</type>です。 あるキーが、<type>整数</type>の標準的な表現形式である場合、 - そのように解釈されます。(つまり、<literal>"8"</literal>は + そのように解釈されます(つまり、<literal>"8"</literal>は <literal>8</literal>として解釈されます。一方、 <literal>"08"</literal>は<literal>"08"</literal>として解釈されま - す。) + す)。<varname>key</varname> に浮動小数点数値を指定すると、 + その値は <type>integer</type> に切り詰められます。 PHPにおいては添字配列と連想配列の間に違いはなく、配列型は1つだ けで、整数または文字列のインデックスを使用することができます。 </para> @@ -1444,9 +1466,8 @@ ?> ]]> </programlisting> - <para> - 上の例は以下のような出力となります。 - <screen> + &example.outputs; + <screen> <![CDATA[ Array ( @@ -1469,8 +1490,7 @@ [1] => 7 ) ]]> - </screen> - </para> + </screen> </informalexample> </note> @@ -1580,9 +1600,8 @@ ]]> </programlisting> </informalexample> - <para> - 上記の出力は次のようになります: - <screen> + &example.outputs; + <screen> <![CDATA[ Checking 0: Notice: Undefined index: $i in /path/to/script.html on line 9 @@ -1600,8 +1619,7 @@ Bad: Good: 2 ]]> - </screen> - </para> + </screen> </note> <para> この具体例を以下に示します。 @@ -1771,10 +1789,11 @@ </sect2> <sect2 id="language.types.array.comparing"> - <title>Comparing</title> + <title>比較</title> <para> - It is possible to compare arrays by <function>array_diff</function> and - by <link linkend="language.operators.array">Array operators</link>. + <function>array_diff</function> と + <link linkend="language.operators.array">配列演算子</link> + を用いると、配列を比較することができます。 </para> </sect2> @@ -1872,9 +1891,7 @@ ?> ]]> </programlisting> - <para> - この例の出力は以下のようになります。 - </para> + &example.outputs; <screen> <![CDATA[ Do you like red? @@ -1911,9 +1928,7 @@ ?> ]]> </programlisting> - <para> - この例の出力は以下のようになります。 - </para> + &example.outputs; <screen> <![CDATA[ Array @@ -1939,9 +1954,7 @@ ?> ]]> </programlisting> - <para> - この例の出力は以下のようになります。 - </para> + &example.outputs; <screen> <![CDATA[ Array @@ -2126,6 +2139,10 @@ </simpara> </note> + <para> + <function>get_resource_type</function> も参照ください。 + </para> + <sect2 id="language.types.resource.casting"> <title>リソースへの変換</title> http://cvs.php.net/diff.php/phpdoc-ja/language/references.xml?r1=1.13&r2=1.14&ty=u Index: phpdoc-ja/language/references.xml diff -u phpdoc-ja/language/references.xml:1.13 phpdoc-ja/language/references.xml:1.14 --- phpdoc-ja/language/references.xml:1.13 Sun Jan 2 02:23:26 2005 +++ phpdoc-ja/language/references.xml Sat Jul 30 20:57:08 2005 @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- $Revision: 1.13 $ --> -<!-- EN-Revision: 1.37 Maintainer: hirokawa Status: ready --> +<!-- $Revision: 1.14 $ --> +<!-- EN-Revision: 1.44 Maintainer: hirokawa Status: ready --> +<!-- CREDITS: takagi --> <chapter id="language.references"> <title>リファレンスの説明</title> @@ -32,7 +33,7 @@ ]]> </programlisting> </informalexample> - この場合、<varname>$a</varname>と<varname>$b</varname>は同じ変数を + この場合、<varname>$a</varname>と<varname>$b</varname>は同じ内容を 指します。 <note> <para> @@ -206,7 +207,10 @@ </informalexample> 関数コールの際には、リファレンス記号がないことに注意してください。関 数定義にのみリファレンス記号があります。リファレンスで正しく引数を - 渡すには、関数定義のみで十分です。 + 渡すには、関数定義のみで十分です。以前のバージョンの PHP では + <literal>foo(&amp;$a);</literal> のような形式で &amp; を利用すると + "Call-time pass-by-reference" という警告が発生していましたが、 + これは今では廃止されています。 </para> <para> 次のものはリファレンスで渡すことが可能です。 @@ -256,10 +260,10 @@ $a = 5; return $a; } -foo(bar()); +foo(bar()); // PHP 5.1.0 以降、致命的なエラーが発生する foo($a = 5); // 式、変数ではない -foo(5); // 定数、変数ではない +foo(5); // 致命的なエラーが発生する ?> ]]> </programlisting> @@ -272,8 +276,11 @@ <title>リファレンスによる返り値</title> <para> リファレンスを返すことは、結合する変数を見付けるために関数を使用し - たい場合に便利です。リファレンスを返す場合、次の構文を使用して下さ - い。 + たい場合に便利です。パフォーマンスを向上させるためだけの目的で + この機能を用いることは<emphasis>やめてください</emphasis>。 + そのようなことをしなくても、PHP エンジンが自動的に最適化を行います。 + リファレンスを返すのは、そうすべき妥当な理由がある場合に限られます! + リファレンスを返す場合、次の構文を使用して下さい。 <informalexample> <programlisting role="php"> <![CDATA[ @@ -302,6 +309,18 @@ せん。 </simpara> </note> + <note> + <simpara> + 以下のような形式で関数からリファレンスを返そうとした場合: + <literal>return ($found_var);</literal> これは、あなたが望んでいるように + <emphasis>式</emphasis> の結果を返してくれることは<emphasis>ありません</emphasis>。 + 可能なことは、値へのリファレンスを返すことができるということだけで、 + それ以外の何者でもありません。 + PHP 4.4.0 および PHP 5.1.0 以降では、式の結果や <literal>new</literal> + 演算子の結果をそのまま返そうとした場合に <constant>E_NOTICE</constant> + エラーが発生します。 + </simpara> + </note> </sect1> <sect1 id="language.references.unset"> http://cvs.php.net/diff.php/phpdoc-ja/language/operators.xml?r1=1.25&r2=1.26&ty=u Index: phpdoc-ja/language/operators.xml diff -u phpdoc-ja/language/operators.xml:1.25 phpdoc-ja/language/operators.xml:1.26 --- phpdoc-ja/language/operators.xml:1.25 Sun Jan 2 02:23:26 2005 +++ phpdoc-ja/language/operators.xml Sat Jul 30 20:57:08 2005 @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- $Revision: 1.25 $ --> -<!-- EN-Revision: 1.80 Maintainer: hirokawa Status: working --> +<!-- $Revision: 1.26 $ --> +<!-- EN-Revision: 1.94 Maintainer: hirokawa Status: working --> +<!-- CREDITS: takagi --> <chapter id="language.operators"> <title>演算子</title> <simpara> @@ -50,90 +51,145 @@ <row> <entry>結合時の評価</entry> <entry>演算子</entry> + <entry>追加情報</entry> </row> </thead> <tbody> <row> <entry>結合しない</entry> <entry>new</entry> + <entry><link linkend="language.oop5.basic.new">new</link></entry> </row> <row> <entry>right</entry> <entry>[</entry> + <entry><function>array</function></entry> </row> <row> <entry>結合しない</entry> <entry>++ --</entry> + <entry> + <link linkend="language.operators.increment">加算子/減算子</link> + </entry> </row> <row> <entry>結合しない</entry> <entry>! ~ - (int) (float) (string) (array) (object) @</entry> + <entry> + <link linkend="language.types">型</link> + </entry> </row> <row> <entry>left</entry> <entry>* / %</entry> + <entry> + <link linkend="language.operators.arithmetic">代数演算子</link> + </entry> </row> <row> <entry>left</entry> <entry>+ - .</entry> + <entry> + <link linkend="language.operators.arithmetic">代数演算子</link>&listendand; + <link linkend="language.operators.string">文字列演算子</link></entry> </row> <row> <entry>left</entry> <entry>&lt;&lt; &gt;&gt;</entry> + <entry> + <link linkend="language.operators.bitwise">ビット演算子</link> + </entry> </row> <row> <entry>結合しない</entry> <entry>&lt; &lt;= &gt; &gt;=</entry> + <entry> + <link linkend="language.operators.comparison">比較演算子</link> + </entry> </row> <row> <entry>結合しない</entry> <entry>== != === !==</entry> + <entry> + <link linkend="language.operators.comparison">比較演算子</link> + </entry> </row> <row> <entry>left</entry> <entry>&amp;</entry> + <entry> + <link linkend="language.operators.bitwise">ビット演算子</link>&listendand; + <link linkend="language.references">リファレンス</link></entry> </row> <row> <entry>left</entry> <entry>^</entry> + <entry> + <link linkend="language.operators.bitwise">ビット演算子</link> + </entry> </row> <row> <entry>left</entry> <entry>|</entry> + <entry> + <link linkend="language.operators.bitwise">ビット演算子</link> + </entry> </row> <row> <entry>left</entry> <entry>&amp;&amp;</entry> + <entry> + <link linkend="language.operators.logical">論理演算子</link> + </entry> </row> <row> <entry>left</entry> <entry>||</entry> + <entry> + <link linkend="language.operators.logical">論理演算子</link> + </entry> </row> <row> <entry>left</entry> <entry>? :</entry> + <entry> + <link linkend="language.operators.comparison.ternary">三項演算子</link> + </entry> </row> <row> <entry>right</entry> <entry> = += -= *= /= .= %= &amp;= |= ^= &lt;&lt;= &gt;&gt;= </entry> + <entry> + <link linkend="language.operators.assignment">代入演算子</link> + </entry> </row> <row> <entry>left</entry> <entry>and</entry> + <entry> + <link linkend="language.operators.logical">論理演算子</link> + </entry> </row> <row> <entry>left</entry> <entry>xor</entry> + <entry> + <link linkend="language.operators.logical">論理演算子</link> + </entry> </row> <row> <entry>left</entry> <entry>or</entry> + <entry> + <link linkend="language.operators.logical">論理演算子</link> + </entry> </row> <row> <entry>left</entry> <entry>,</entry> + <entry>さまざまな利用法</entry> </row> </tbody> </tgroup> @@ -487,32 +543,97 @@ </programlisting> </informalexample> </para> + <para> - 条件演算子としては、他に "?:"演算子(または三項演算子)があります。 - この演算子の動作は、Cまたは他の多く言語と同じです。 - <informalexample> + オペランドの型が違う場合は、以下の表に(上から順に)したがって + 比較が行われます。 + </para> + <table> + <title>異なる型の比較</title> + <tgroup cols="3"> + <thead> + <row> + <entry>第 1 オペランドの型</entry> + <entry>第 2 オペランドの型</entry> + <entry>結果</entry> + </row> + </thead> + <tbody> + <row> + <entry><type>null</type> または <type>string</type></entry> + <entry><type>string</type></entry> + <entry>&null; を "" に変換し、数値または文字として比較します</entry> + </row> + <row> + <entry><type>bool</type> または <type>null</type></entry> + <entry>あらゆる型</entry> + <entry><type>bool</type> に変換し、&false; &lt; &true; と判断します</entry> + </row> + <row> + <entry><type>object</type></entry> + <entry><type>object</type></entry> + <entry>組み込みクラスには独自の比較基準が定義されています。それ以外の + クラスは比較できません。同じクラスであるかどうかは - プロパティが + 同じ値であるかどうかを配列形式で比較(PHP 4)、PHP 5 では <link + linkend="language.oop5.object-comparison">ここで説明されています</link>。 + </entry> + </row> + <row> + <entry><type>string</type>, <type>resource</type> または <type>number</type></entry> + <entry><type>string</type>, <type>resource</type> または <type>number</type></entry> + <entry>文字列やリソースを数値に変換し、算術演算を行います</entry> + </row> + <row> + <entry><type>array</type></entry> + <entry><type>array</type></entry> + <entry>要素数の少ない配列のほうが小さくなります。オペランド 1 のキーが + オペランド 2 に存在しない場合、配列は比較できません。そうでない場合は + 個々の要素の値を比較します(以下の例を参照ください)</entry> + </row> + <row> + <entry><type>array</type></entry> + <entry>あらゆる型</entry> + <entry><type>array</type> のほうが常に大きくなります</entry> + </row> + <row> + <entry><type>object</type></entry> + <entry>あらゆる型</entry> + <entry><type>object</type> のほうが常に大きくなります</entry> + </row> + </tbody> + </tgroup> + </table> + <para> + <example> + <title>一般的な配列の比較</title> <programlisting role="php"> <![CDATA[ <?php -// 三項演算子の使用例 -$action = (empty($_POST['action'])) ? 'default' : $_POST['action']; - -// 上記は以下のif/else式と同じです。 -if (empty($_POST['action'])) { - $action = 'default'; -} else { - $action = $_POST['action']; +// 標準の比較演算子を用いて、配列はこのように比較されます +function standard_array_compare($op1, $op2) +{ + if (count($op1) < count($op2)) { + return -1; // $op1 < $op2 + } elseif (count($op1) > count($op2)) { + return 1; // $op1 > $op2 + } + foreach ($op1 as $key => $val) { + if (!array_key_exists($key, $op2)) { + return null; // uncomparable + } elseif ($val < $op2[$key]) { + return -1; + } elseif ($val > $op2[$key]) { + return 1; + } + } + return 0; // $op1 == $op2 } ?> ]]> </programlisting> - </informalexample> - <literal>(expr1) ? (expr2) : (expr3)</literal> - という式は、<replaceable>式1</replaceable> が&true;の場合に - <replaceable>式2</replaceable> を、 - <replaceable>式1</replaceable> が&false;の場合に - <replaceable>式3</replaceable> を値とします。 + </example> </para> + <para> <function>strcasecmp</function>, <function>strcmp</function>、 @@ -520,6 +641,47 @@ マニュアルの <link linkend="language.types">型</link> のセクションも参照してください。 </para> + + <sect2 id="language.operators.comparison.ternary"> + <title>三項演算子</title> + <para> + もうひとつの条件演算子として "?:"(あるいは三項)演算子があります。 + <example> + <title>デフォルト値を設定する</title> + <programlisting role="php"> + <![CDATA[ + <?php + // 三項演算子の使用例 + $action = (empty($_POST['action'])) ? 'default' : $_POST['action']; + + // 上記は以下のif/else式と同じです。 + if (empty($_POST['action'])) { + $action = 'default'; + } else { + $action = $_POST['action']; + } + + ?> + ]]> + </programlisting> + </example> + <literal>(expr1) ? (expr2) : (expr3)</literal> + という式は、<replaceable>式1</replaceable> が &true; の場合に + <replaceable>式2</replaceable> を、 + <replaceable>式1</replaceable> が &false; の場合に + <replaceable>式3</replaceable> を値とします。 + </para> + <note> + <simpara> + 三項演算子は式であり、値としては評価されずに式の結果として評価される + ことに注意してください。演算結果をリファレンスとして返したい場合に、 + これを知っておくことが大切です。結果をリファレンスとして返す関数で + <literal>return $var == 42 ? $a : $b;</literal> とすることはできず、 + 新しいバージョンの PHP では警告を発生します。 + </simpara> + </note> + </sect2> + </sect1> <sect1 id="language.operators.errorcontrol"> @@ -570,11 +732,6 @@ <link linkend="ref.errorfunc">エラー処理とログ出力関数</link> も参照してください。 </simpara> - <note> - <para> - パースエラーによるメッセージを@演算子で抑制することはできません。 - </para> - </note> <warning> <para> 現在、誤差制御演算子プレフィックス"@"は、スクリプトの実行を終了す @@ -624,8 +781,15 @@ <sect1 id="language.operators.increment"> <title>加算子/減算子</title> <para> - PHP はC言語形式を前置および後置の加算子および減算子をサポートします。 + PHP は C 言語形式の加算子/減算子(前置・後置ともに)をサポートします。 </para> + <note> + <simpara> + 加算子/減算子は bool 型の値には何も変更を加えません。 + 同じく &null; に減算子を適用しても何も起こりませんが、&null; に加算子を + 適用すると <literal>1</literal> となります。 + </simpara> + </note> <table> <title>加算子/減算子</title> <tgroup cols="3"> @@ -702,23 +866,23 @@ <![CDATA[ <?php $i = 'W'; -for($n=0; $n<6; $n++) - echo ++$i . "\n"; - -/* - 以下のような結果が出力されます: - +for ($n=0; $n<6; $n++) { + echo ++$i . "\n"; +} +?> +]]> + </programlisting> + &example.outputs; + <screen> +<![CDATA[ X Y Z AA AB AC - -*/ -?> ]]> - </programlisting> + </screen> </example> </para> <para> @@ -821,9 +985,9 @@ <tgroup cols="3"> <thead> <row> - <entry>Example</entry> - <entry>Name</entry> - <entry>Result</entry> + <entry>例</entry> + <entry>名前</entry> + <entry>結果</entry> </row> </thead> <tbody> @@ -835,12 +999,13 @@ <row> <entry>$a == $b</entry> <entry>Equality</entry> - <entry>&true; if $a and $b have the same elements.</entry> + <entry>&true; if $a and $b have the same key/value pairs.</entry> </row> <row> <entry>$a === $b</entry> <entry>Identity</entry> - <entry>&true; if $a and $b have the same elements in the same order.</entry> + <entry>&true; if $a and $b have the same key/value pairs in the same + order and of the same types.</entry> </row> <row> <entry>$a != $b</entry> http://cvs.php.net/diff.php/phpdoc-ja/language/oop.xml?r1=1.24&r2=1.25&ty=u Index: phpdoc-ja/language/oop.xml diff -u phpdoc-ja/language/oop.xml:1.24 phpdoc-ja/language/oop.xml:1.25 --- phpdoc-ja/language/oop.xml:1.24 Sun Jan 2 02:23:26 2005 +++ phpdoc-ja/language/oop.xml Sat Jul 30 20:57:08 2005 @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- $Revision: 1.24 $ --> -<!-- EN-Revision: 1.54 Maintainer: hirokawa Status: ready --> +<!-- $Revision: 1.25 $ --> +<!-- EN-Revision: 1.64 Maintainer: hirokawa Status: ready --> +<!-- CREDITS: takagi --> <chapter id="language.oop"> <title>クラスとオブジェクト (PHP 4)</title> @@ -19,24 +20,27 @@ class Cart { var $items; // 買い物カゴの中のアイテム - + // $num 個の $artnr を買い物カゴに加えます - + function add_item ($artnr, $num) { $this->items[$artnr] += $num; } - + // $num 個の $artnr を買い物カゴから出します - + function remove_item ($artnr, $num) { if ($this->items[$artnr] > $num) { $this->items[$artnr] -= $num; return true; + } elseif ($this->items[$artnr] == $num) { + unset($this->items[$artnr]); + return true; } else { return false; - } + } } } ?> @@ -53,8 +57,10 @@ <warning> <simpara> - 複数のファイルや複数のPHPブロックで分割してクラスを定義定義することは - <emphasis>できません</emphasis>。以下の例は動作しません。 + 複数のファイルで分割してクラスを定義することは + <emphasis>できません</emphasis>。また、関数定義の内部分割されている + 場合を除き、複数の PHP ブロックで分割してクラスを定義することも + <emphasis>できません</emphasis>。次の例は正しく動作しません: </simpara> <para> <informalexample> @@ -73,6 +79,26 @@ </programlisting> </informalexample> </para> + <simpara> + しかし、次の例は許されます: + </simpara> + <para> + <informalexample> + <programlisting role="php"> +<![CDATA[ +<?php +class test { + function test() { + ?> + <?php + print 'OK'; + } +} +?> +]]> + </programlisting> + </informalexample> + </para> </warning> <simpara> @@ -174,20 +200,19 @@ <para> <varname>$cart</varname>と<varname>$another_cart</varname>は共に関数 add_item()、 - remove_item() と変数items を有しています。これらは、異なる関数およ - び変数です。オブジェクトは、ファイルシステムのディレクトリに似たよ - うなものであると考えられます。ファイルシステムでは、別のディレクト - リに置く限り、二つの異なるREADME.TXTを保持することが可能です。ディ - レクトリではトップディレクトリから各ファイルにアクセスするには、フ - ルパス名を入力する必要がありますが、これと全く同様にコールしたい関 - 数の完全な名前を指定する必要があります。PHPの用語では、最上位のディ - レクトリはグローバル名前空間であり、パス名のセパレータは、<literal>-&gt;</literal> - となります。つまり、<varname>$cart-&gt;items</varname> と - <varname>$another_cart-&gt;items</varname> は、 - 二つの異なる変数です。<varname>$cart-&gt;items</varname>という名前の変数は、 - <varname>$cart-&gt;$items</varname>ではない、つまり、 - PHPの変数名はドル記号を一つだけ - 有することに注意してください。 + remove_item() と変数items を有しています。これらは、異なる関数および変数です。 + オブジェクトは、ファイルシステムのディレクトリに似たようなものであると + 考えられます。ファイルシステムでは、別のディレクトリに置く限り、 + 二つの異なる<filename>README.TXT</filename>を保持することが可能です。 + ディレクトリではトップディレクトリから各ファイルにアクセスするには、 + フルパス名を入力する必要がありますが、これと全く同様にコールしたい + 関数の完全な名前を指定する必要があります。PHPの用語では、最上位の + ディレクトリはグローバル名前空間であり、パス名のセパレータは、 + <literal>-&gt;</literal> となります。つまり、<varname>$cart-&gt;items</varname> + と <varname>$another_cart-&gt;items</varname> は、二つの異なる変数です。 + <varname>$cart-&gt;items</varname>という名前の変数は、 + <varname>$cart-&gt;$items</varname>ではない、つまり、PHP の変数名は + ドル記号を一つだけ有することに注意してください。 </para> <informalexample> @@ -226,6 +251,62 @@ <note> <para> + 擬似変数 <varname>$this</varname> は、メソッドが静的にコールされた場合に + 常に定義されるわけではありません。しかし、はっきりしていることは: + もしメソッドが別のオブジェクトから静的にコールされている場合は + <varname>$this</varname> が定義されるということです。 + この場合、<varname>$this</varname> は呼び出し元のオブジェクトとなります。 + これを説明したのが次の例です: + <informalexample> + <programlisting role="php"> +<![CDATA[ +<?php +class A +{ + function foo() + { + if (isset($this)) { + echo '$this is defined ('; + echo get_class($this); + echo ")\n"; + } else { + echo "\$this is not defined.\n"; + } + } +} + +class B +{ + function bar() + { + A::foo(); + } +} + +$a = new A(); +$a->foo(); +A::foo(); +$b = new B(); +$b->bar(); +B::bar(); +?> +]]> + </programlisting> + &example.outputs; + <screen> +<![CDATA[ +$this is defined (a) +$this is not defined. +$this is defined (b) +$this is not defined. +]]> + </screen> + </informalexample> + </para> + </note> + + <note> + <para> クラスとオブジェクトを処理する優れた関数がいくつかあります。 <link linkend="ref.classobj">クラス/オブジェクト関数</link> をざっとみてみると良いでしょう。 @@ -309,23 +390,14 @@ </sect1> <sect1 id="language.oop.constructor"> - <title><literal>コンストラクタ</literal></title> - - <caution> - <simpara> - PHP 3 と PHP 4 では、コンストラクタの動作は異なります。PHP 4の定 - 義の方が明らかに好ましいと言えます。 - </simpara> - </caution> + <title>コンストラクタ</title> <para> コンストラクタは、<literal>new</literal>によりクラスの新しいインス タンスを作成する際に自動的にコールされるクラス関数です。 - PHP 3では、ある関数が、クラス名と同じ名前を有している場合にコンス - トラクタになりました。PHP 4では、ある関数が、そのコンストラクタが - 定義されているクラスと同じ名前を有している場合にコンストラクタにな - ります。これらの違いは僅かですが、重要な違いがあります。(以下、参 - 照) + ある関数が、クラス名と同じ名前を有している場合にコンストラクタに + なります。コンストラクタが存在しない場合、もし基底クラスの + コンストラクタが存在すれば、それがコールされます。 </para> <informalexample> @@ -359,7 +431,6 @@ <programlisting role="php"> <![CDATA[ <?php -// PHP 3 と PHP 4の両方で動作 class Constructor_Cart extends Cart { function Constructor_Cart($item = "10", $num = 1) @@ -369,11 +440,9 @@ } // しつこいが、前の例と同じものを買う - $default_cart = new Constructor_Cart; // 実際に買うものカゴに入れる... - $different_cart = new Constructor_Cart("20", 17); ?> ]]> @@ -386,52 +455,6 @@ 可能です。例:<literal>@new</literal> </para> - <caution> - <simpara> - PHP 3では、派生クラスとコンストラクタには複数の制約があります。こ - れらの制限を理解するために以下の例を注意して御覧ください。 - </simpara> - </caution> - - <informalexample> - <programlisting role="php"> -<![CDATA[ -class A -{ - function A() - { - echo "Aのコンストラクタです<br>\n"; - } -} - -class B extends A -{ - function C() - { - "通常の関数<br>\n"; - } -} - -// PHP 3ではコンストラクタはコールされません -$b = new B; -]]> - </programlisting> - </informalexample> - - <para> - PHP 3では、上の例でコンストラクタはコールされません。PHP 3の規則で - は、「コンストラクタはクラスと同じ名前を有する関数です。」となりま - す。クラス名はBであり、クラスBの中にはB()という関数がないため、何 - もおきません。 - </para> - - <para> - PHP 3では、上の例でコンストラクタはコールされません。PHP 3の規則で - は、「コンストラクタはクラスと同じ名前を有する関数です。」となりま - す。クラス名はBであり、クラスBの中にはB()という関数がないため、何 - もおきません。 - </para> - <informalexample> <programlisting role="php"> <![CDATA[ @@ -451,10 +474,6 @@ class B extends A { - function C() - { - echo "通常の関数です<br>\n"; - } } // これにより、B() がコンストラクタとしてコールされます。 @@ -464,42 +483,27 @@ </informalexample> <para> - PHP 3では、クラスAの関数 B() は意図されていない場合でも、クラスB - のコンストラクタに突然なってしまいました。PHP 3の規則は次のように - なります。「コンストラクタはクラス名と同じ名前の関数である。」PHP - 3は、この関数がクラスBで定義されているかとかその関数が継承されてい - るかどうかは考慮しません。 - </para> - - <para> - これは、PHP 4では次のように規則が修正されました。「コンストラクタ - は、それが定義されているクラスと同じ名前の関数である」つまり、PHP - 4では、クラスBが独自のコンストラクタ関数を持たない場合には、基底ク - ラスのコンストラクタがコールされ、「Aのコンストラクタです&lt;br&gt;」 - と出力されます。 + クラスAの関数 B() は、意図されていない場合でも突然クラスB の + コンストラクタになってしまいました。PHP 4 は、この関数が + クラスBで定義されているかとかその関数が継承されているかどうかは + 考慮しません。 </para> <caution> <simpara> - PHP 3 および PHP 4のどちらでも派生クラスのコンストラクタから基底 - クラスのコンストラクタを自動的にコールすることはできません。 + PHP 4 では派生クラスのコンストラクタから基底クラスの + コンストラクタを自動的にコールすることはできません。 上流のコンストラクタを適切にコールするように伝播させることは あなたの責任でやるべきことです。 </simpara> </caution> - <note> - <simpara> - PHP 3およびPHP 4には、デストラクタはありません。デストラクタの機 - 能の多くをシミュレーションするには、代わりに - <function>register_shutdown_function</function> を使用します。 - </simpara> - </note> - <para> デストラクタは、<function>unset</function>またはスコープから でることにより、オブジェクトが破棄される度に自動的にコールされる関数です。 - PHPにはデストラクタはありません。 + PHPにはデストラクタはありません。デストラクタの機能の多くを + シミュレーションするには、代わりに + <function>register_shutdown_function</function> を使用します。 </para> </sect1> @@ -648,7 +652,7 @@ <caution> <simpara> - 以下の情報は、PHP 4でのみ有効です。 + 以下の情報は、PHP 4 以降でのみ有効です。 </simpara> </caution> @@ -945,9 +949,7 @@ ?> ]]> </programlisting> - <para> - この例の出力は以下のようになります。 - </para> + &example.outputs; <screen> <![CDATA[ class A: 10 @@ -1029,9 +1031,9 @@ ?> ]]> </programlisting> - </example> - 以下のような出力になります: - <screen> + &example.outputs; + <screen> +<![CDATA[ 同じ引数で生成されたインスタンスの比較 o1 == o2 : TRUE o1 != o2 : FALSE @@ -1049,7 +1051,9 @@ o1 != o2 : TRUE o1 === o2 : FALSE o1 !== o2 : TRUE - </screen> +]]> + </screen> + </example> 比較のルールに基づいた結果が得られたと思います。 その属性に同じ値を持ち、かつ同じクラスから生成されたインスタンスだけが 等しいとみなされます。 @@ -1096,9 +1100,9 @@ ?> ]]> </programlisting> - </example> - Which gives the expected output: - <screen> + &example.outputs; + <screen> +<![CDATA[ Composite objects u(o,p) and v(q,p) o1 == o2 : TRUE o1 != o2 : FALSE @@ -1110,7 +1114,9 @@ o1 != o2 : TRUE o1 === o2 : FALSE o1 !== o2 : TRUE - </screen> +]]> + </screen> + </example> </para> </sect1> http://cvs.php.net/diff.php/phpdoc-ja/language/functions.xml?r1=1.20&r2=1.21&ty=u Index: phpdoc-ja/language/functions.xml diff -u phpdoc-ja/language/functions.xml:1.20 phpdoc-ja/language/functions.xml:1.21 --- phpdoc-ja/language/functions.xml:1.20 Sun Jan 2 02:23:26 2005 +++ phpdoc-ja/language/functions.xml Sat Jul 30 20:57:08 2005 @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- $Revision: 1.20 $ --> -<!-- EN-Revision: 1.55 Maintainer: hirokawa Status: ready --> +<!-- $Revision: 1.21 $ --> +<!-- EN-Revision: 1.59 Maintainer: hirokawa Status: ready --> +<!-- CREDITS: takagi --> <chapter id="language.functions"> <title>関数</title> @@ -25,14 +26,6 @@ </informalexample> </para> - <!-- - - status of func(const $param) ? - zend doesn't care at all whether or not you specify it. - I've never seen it before... what's its use? (or was...) - - --> - <simpara> 関数の中では、他の関数や <link linkend="keyword.class">クラス</link> 定義 を含む PHP のあらゆる有効なコードを使用することができます。 @@ -115,6 +108,11 @@ </programlisting> </example> </para> + <para> + PHP では、関数やクラスはすべてグローバルスコープにあります - + 関数の内部で定義したものであっても関数の外部からコールできますし、 + その逆も可能です。 + </para> <simpara> PHP は関数のオーバーロードをサポートしていません。 また、宣言された関数の定義を取り消したり再定義することも @@ -137,6 +135,28 @@ <function>func_get_args</function> に関する関数リファレンスを 参照ください。 </simpara> + + <para> + PHP では、関数を再帰的にコールすることが可能です。ただし、100 から 200 + を超えるような再帰呼び出しは避けてください。そんなことをすると、 + スタックが破壊され、スクリプトが異常終了してしまいます。 + <example> + <title>再帰的な関数</title> + <programlisting role="php"> +<![CDATA[ +<?php +function recursion($a) +{ + if ($a < 20) { + echo "$a\n"; + recursion($a + 1); + } +} +?> +]]> + </programlisting> + </example> + </para> </sect1> @@ -145,7 +165,7 @@ <simpara> 引数のリストにより関数へ情報を渡すことができます。 - このリストは、カンマで区切られた変数や定数のリストです。 + このリストは、カンマで区切られた式のリストです。 </simpara> <para> PHP は、値渡し(デフォルト)、 http://cvs.php.net/diff.php/phpdoc-ja/language/expressions.xml?r1=1.12&r2=1.13&ty=u Index: phpdoc-ja/language/expressions.xml diff -u phpdoc-ja/language/expressions.xml:1.12 phpdoc-ja/language/expressions.xml:1.13 --- phpdoc-ja/language/expressions.xml:1.12 Sun Jan 2 02:23:26 2005 +++ phpdoc-ja/language/expressions.xml Sat Jul 30 20:57:08 2005 @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- $Revision: 1.12 $ --> -<!-- EN-Revision: 1.21 Maintainer: hirokawa Status: ready --> +<!-- $Revision: 1.13 $ --> +<!-- EN-Revision: 1.30 Maintainer: hirokawa Status: ready --> +<!-- CREDITS: takagi --> <chapter id="language.expressions"> <title>式</title> @@ -46,7 +47,8 @@ <simpara> あなたが関数の概念に慣れていると仮定すると - (そうでない場合は、関数に関する章を参照ください。)、 + (そうでない場合は、<link linkend="language.functions">関数</link> + に関する章を参照ください。)、 <literal>$c = foo()</literal> と入力することは、 <literal>$c = 5</literal> と書くことと本質的に全く同じで あると予想されたかもしれません。この予想は、正しいです。 @@ -58,7 +60,9 @@ <simpara> もちろん、PHP の値は整数である必要はありませんし、 多くの場合、そうではありません。 - PHP は、3 種類のスカラー型(整数、浮動小数点数、文字列)をサポートします。 + PHP は、4 種類のスカラー型: 整数(<type>integer</type>)、 + 浮動小数点数(<type>float</type>)、文字列(<type>string</type>)、 + 真偽値(<type>boolean</type>) をサポートします。 (スカラーとは、配列とかと異なり、より小さな部分に'分割する'ことが できない値のことです。) PHP は、2種類の複合(非スカラー)型(配列とオブジェクト)もサポートします。 @@ -67,9 +71,7 @@ </simpara> <simpara> - これまでのところ、PHP/FI 2 のユーザーは何も変わったところがないと - 思ったことでしょう。 - しかし、PHP は、他の多くの言語が行うのと同じ手法で、 + PHP は、他の多くの言語が行うのと同じ手法で、 更に多くの式を使用可能です。 PHP 3 は、ほとんど全てが式であるという意味で、式指向の言語です。 既に取り扱った '$a=5' という例について考えてみましょう。 @@ -90,9 +92,9 @@ <simpara> 式の配置に関する別の良い例は、前置、後置加算子、あるいは減算子です。 - PHP/FI 2 と他の多くの言語のユーザーは、variable++ や + PHP と他の多くの言語のユーザーは、variable++ や variable-- といった表記法に慣れていることでしょう。 - これらは、加算子および減算子です。 + これらは、<link linkend="language.operators.increment">加算子および減算子</link>です。 PHP/FI 2 においては、文 '$a++' は値を持ちませんでした。 (この文は、式ではありませんでした。) このため、この式に代入したり、なんらかの手法でこれを使用することが @@ -115,11 +117,14 @@ '後置加算(post-increment)' という名前がついています。) </simpara> <simpara> - 比較演算子は、極めて標準的な式です - 比較演算子は、0、1のどちらかを値とします。 - この値の意味は、(それぞれ、) &false; と &true; です。 + <link linkend= "language.operators.comparison">比較</link>演算子は、 + 極めて標準的な式です。 + 比較演算子は、&false; または &true; のどちらかを値とします。 PHPは、&gt;(大なり)、 &gt;=(大なりイコール)、=(イコール)、 &lt;(小なり)、&lt;=(小なりイコール)をサポートします。 + PHP 言語は、いくつかの厳密な等価演算子: === + (イコールかつ同じ型) そして !== (イコールではないまたは型が違う) も + サポートします。 これらの式は、<literal>if</literal>文のような条件式の内部で一般的に 使用されます。 </simpara> @@ -156,7 +161,7 @@ 他の言語で見たことがない場合には理解できないかもしれません。 <informalexample> - <programlisting> + <programlisting role="php"> <![CDATA[ <?php $first ? $second : $third @@ -202,9 +207,7 @@ </para> <simpara> - 本章のはじめで、様々な文の型について書くと言いましたが、 - 約束したように、式は、文なのです。 - しかし、全ての式がひとつの文なわけではありません。 + 式が、文として扱われることがあります。 この場合、文は、'式'';' 、つまり式の後にセミコロンがついた形式です。 '$b=$a=5' において、$a=5 は有効な式ですが、自身を値とする文では ありません。しかし、'$b=$a=5;' は有効な文です。 @@ -228,7 +231,7 @@ それを完全に記述することは、このマニュアルの範囲を超えています。 上記の例は、式とは何か、そして、便利な式をどうやって作るかということ に関して良いアイデアを与えるに違いありません。 - 本マニュアルの残りの部分では<replaceable>expr</replaceable>という + 本マニュアルの残りの部分では<varname>expr</varname>という マークを使用しますが、これは PHP の有効な式を意味します。 </simpara> </chapter> http://cvs.php.net/diff.php/phpdoc-ja/language/control-structures.xml?r1=1.37&r2=1.38&ty=u Index: phpdoc-ja/language/control-structures.xml diff -u phpdoc-ja/language/control-structures.xml:1.37 phpdoc-ja/language/control-structures.xml:1.38 --- phpdoc-ja/language/control-structures.xml:1.37 Sun Jan 2 02:23:26 2005 +++ phpdoc-ja/language/control-structures.xml Sat Jul 30 20:57:08 2005 @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- $Revision: 1.37 $ --> -<!-- EN-Revision: 1.110 Maintainer: hirokawa Status: ready --> +<!-- $Revision: 1.38 $ --> +<!-- EN-Revision: 1.123 Maintainer: hirokawa Status: ready --> +<!-- CREDITS: takagi --> <chapter id="language.control-structures"> <title>制御構造</title> @@ -477,6 +478,11 @@ 2番目の形式も同様ですが、各ループで現在の要素のキーが変数 <literal>$key</literal>に代入されるところが異なります。 </simpara> + <simpara> + PHP 5 では、 + <link linkend="language.oop5.iterations">オブジェクトのイタレーション</link> + を用いることもできます。 + </simpara> <para> <note> <para> @@ -490,8 +496,9 @@ <para> <note> <para> - <literal>foreach</literal>は、指定した配列自体に対してではなく、 - そのコピーに対して処理を行うことに注意してください。このため、 + 配列が <link linkend="language.references">リファレンス</link> + でない限り、<literal>foreach</literal>は、指定した配列自体に対してではなく、 + そのコピーに対して処理を行います。このため、 <function>each</function> 文のように配列のポインタ位置が変更され ることはなく、返される配列要素への変更は、元の配列には反映されません。 しかし、元の配列の内部ポインタは、配列の処理に伴い前に進められます。 @@ -672,8 +679,8 @@ <title><literal>continue</literal></title> <simpara> <literal>continue</literal>は、ループ構造において現在の繰り返しループ - の残りの処理をスキップし、次の繰り返しの最初から実行を続けるために - 使用されます、 + の残りの処理をスキップし、条件式を評価した後に + 次の繰り返しの最初から実行を続けるために使用されます、 </simpara> <note> <simpara> @@ -1042,7 +1049,7 @@ if ($dump) { $temp = $profile; unset($profile); - return($temp); + return $temp; } $profile[] = microtime(); @@ -1112,13 +1119,25 @@ さらに詳しい情報に関しては<link linkend="functions.returning-values"> 返り値</link>を参照してください。 </simpara> + <para> <note> <simpara> <function>return</function>は関数ではなく言語構造であるため引数を 括弧で囲う必要があるのは、引数に式が含まれている場合のみです。 - 値を返す際に、括弧で括らずそのままにしておくのが一般的です。 + 変数を返す際には、括弧で括らずそのままにしておくのが一般的です。 + またそのほうが PHP にかかる負荷も低くなります。 </simpara> </note> + <note> + <simpara> + 変数をリファレンスで返す場合は、<emphasis>決して</emphasis>引数を + 括弧で囲うべきではありません。そのようにすると正しく動作しません。 + <literal>return ($a);</literal> とすると、変数を返すのではなく + <literal>($a)</literal> を評価した結果を返すことになります + (この場合は、もちろん <varname>$a</varname> の値です)。 + </simpara> + </note> + </para> </sect1> <sect1 id="function.require"> @@ -1205,7 +1224,8 @@ <function>include</function>を使用すると、読み込むべきファイルが存在しない 場合も処理が続行されます。<link linkend="ini.include-path">include_path </link>を適切に設定することも忘れないでください。 - 読みこまれたファイルで発生したパースエラーは処理を中断しないことに注意してください。 + PHP 4.3.5 より前のバージョンでは include されたファイルにパースエラーが + あっても処理が続行されましたが、それ以降のバージョンでは処理を停止します。 </simpara> <simpara> 読み込むファイルはまずカレントのワーキングディレクトリからの相対パスとしてinclude_path @@ -1218,12 +1238,17 @@ <filename>b.php</filename> がまず <filename class="directory">/www/</filename>で探され、その後、 <filename class="directory">/www/include/</filename>で探されます。 + ファイル名が <literal>../</literal> で始まっている場合は、 + カレントのワーキングディレクトリからの相対パスとしてinclude_path + で探されるのみとなります。 </simpara> <simpara> ファイルが読み込まれるとそのファイルに含まれるコードは、 <function>include</function>もしくは<function>require</function>が実行された 行の<link linkend="language.variables.scope">変数スコープ</link>を継承します。 呼び出し側の行で利用可能である全ての変数は、読み込まれたファイル内で利用可能です。 + しかし、読み込まれたファイル内で定義されている関数やクラスはすべて + グローバルスコープとなります。 </simpara> <para> <example> @@ -1469,12 +1494,41 @@ <function>include_once</function>を使用することを推奨します。 </para> <simpara> - ファイルを"読み込む"ための他の方法としては - <function>fopen</function>や<function>file</function>、そして - <function>include</function>を + PHP ファイルの内容を変数に "include する" もうひとつの方法は、 <link linkend="ref.outcontrol">出力制御関数</link> - と共に使用する方法があります。 + を <function>include</function> とともに用いて + 出力をキャプチャすることです。たとえば、 </simpara> + <para> + <example> + <title>出力バッファリングを用い、 PHP ファイルの内容を文字列として読み込む</title> + <programlisting role="php"> +<![CDATA[ +<?php +$string = get_include_contents('somefile.php'); + +function get_include_contents($filename) { + if (is_file($filename)) { + ob_start(); + include $filename; + $contents = ob_get_contents(); + ob_end_clean(); + return $contents; + } + return false; +} + +?> +]]> + </programlisting> + </example> + </para> + <para> + スクリプト中で自動的にファイルをインクルードするには、&php.ini; の + <link linkend="ini.auto-prepend-file">auto_prepend_file</link> および + <link linkend="ini.auto-append-file">auto_append_file</link> + オプションも参照ください。 + </para> &note.language-construct; http://cvs.php.net/diff.php/phpdoc-ja/language/constants.xml?r1=1.19&r2=1.20&ty=u Index: phpdoc-ja/language/constants.xml diff -u phpdoc-ja/language/constants.xml:1.19 phpdoc-ja/language/constants.xml:1.20 --- phpdoc-ja/language/constants.xml:1.19 Sun Jan 2 02:23:26 2005 +++ phpdoc-ja/language/constants.xml Sat Jul 30 20:57:09 2005 @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- $Revision: 1.19 $ --> -<!-- EN-Revision: 1.39 Maintainer: hirokawa Status: ready --> +<!-- $Revision: 1.20 $ --> +<!-- EN-Revision: 1.40 Maintainer: hirokawa Status: ready --> +<!-- CREDITS: takagi --> <chapter id="language.constants"> <title>定数</title> @@ -188,6 +189,9 @@ <entry> ファイルのフルパスとファイル名。インクルードされるファイルの 中で使用された場合、インクルードされるファイルの名前が返されます。 + PHP 4.0.2 以降では、<constant>__FILE__</constant> + は常に絶対パスです。それより前のバージョンでは、場合によっては + 相対パスが返されることもあります。 </entry> </row> <row> http://cvs.php.net/diff.php/phpdoc-ja/language/basic-syntax.xml?r1=1.12&r2=1.13&ty=u Index: phpdoc-ja/language/basic-syntax.xml diff -u phpdoc-ja/language/basic-syntax.xml:1.12 phpdoc-ja/language/basic-syntax.xml:1.13 --- phpdoc-ja/language/basic-syntax.xml:1.12 Sun Jan 2 02:23:26 2005 +++ phpdoc-ja/language/basic-syntax.xml Sat Jul 30 20:57:09 2005 @@ -1,131 +1,121 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- $Revision: 1.12 $ --> -<!-- EN-Revision: 1.36 Maintainer: hirokawa Status: ready --> +<!-- $Revision: 1.13 $ --> +<!-- EN-Revision: 1.45 Maintainer: hirokawa Status: ready --> +<!-- CREDITS: takagi --> <chapter id="language.basic-syntax"> <title>基本的な構文</title> - - <!-- - - NOTE: Last modified: 2001-05-16 13:00 GMT - - the language part is currently under heavy revision. Please do not - not make any heavy (i.e. structural) modifications to this part - for a moment. - - You'd also better not start any translation yet. - - Comments are always welcome at phpdoc@lists.php.net - - Progress: - - intro : DOESN'T EXIST - yet? - new chapter, with some introductionary remarks? - Will be discussed on the ML soon. - basic-syntax: - FINISHED - except maybe moving the 'advanced escaping' - to a better place? - TODO: - - nada - types : Being revised. Added all new types - Boolean and Integer are more or less finished. - The rest isn't. - TODO: - - why is $foo[bar] bad syntax? - - what's the difference between unset($bla) and - $bla = NULL; (it is different!) - - $obj->{expr} syntax - - (unset) cast????? - - $bla = unset <== should've been nuked, don't mention it - - $str{offset} syntax, rather than $str[offset] - - read notes and apply when any of them are useful - - remove notes which have been included here. - - ... - the rest: Not yet started with. - TODO: - - ? - oop : has been revised by Kristian, DONE. - --> - <sect1 id="language.basic-syntax.phpmode"> <title>HTML からの脱出</title> - <para> - PHPはファイルからPHPコードの開始を示す特別なタグを見つけるまでは - 単純にその内容を出力します。PHPコードの開始を示すタグが見つかると - PHPはコードの終了を示すタグとの間にあるコードを実行します。この - メカニズムによりPHPコードをHTMLの中に埋め込むことが出来るのです。 - つまり、PHPタグの中にある文字列はPHPコードとして解釈されますが、 - 外にある文字列(つまり普通のHTML)はあくまで単純に出力されるだけ - ということです。 + PHP はファイルを解析して開始タグと終了タグを探します。タグが + 見つかると、PHP はコードの実行を開始したり終了したりします。 + このような仕組みにより、PHP を他のあらゆる形式のドキュメント中に + 埋め込むことができるのです。つまり、開始タグと終了タグで囲まれている + 箇所以外のすべての部分は、PHP パーサに無視されます。 + たいていの場合、PHP は HTML ドキュメントの中に埋め込まれます。 + たとえば以下のようにです。 + <informalexample> + <programlisting role="php"> +<![CDATA[ +<p>この部分は無視されます。</p> +<?php echo '一方、この部分はパースされます。'; ?> +<p>この部分も無視されます。</p> +]]> + </programlisting> + </informalexample> </para> - <para> - PHPコードのブロックであることを宣言するタグは4種類あります。 - これらのうちの2つ((&lt;?php. . .?&gt;と&lt;script language="php"&gt; - . . .&lt;/script&gt;)は常に使用することが出来ます。その他の - タグは<filename>php.ini</filename>設定ファイルでonまたはoffに - するとが出来ます。短縮型のタグ(&lt;?. . .?&gt;)とASP形式の - タグは便利なのですが、長いタグに比べると移植性に欠けます。 - また、PHPコードをXMLやXHTMLに埋め込もうとする場合にはXMLの - 規格に従うために&lt;?php. . .?&gt;形式を使用する必要があるでしょう。 + もっと複雑な構造を用いることもできます: + <example> + <title>高度なエスケープ処理</title> + <programlisting role="php"> +<![CDATA[ +<?php +if ($expression) { + ?> + <strong>真です。</strong> + <?php +} else { + ?> + <strong>偽です。</strong> + <?php +} +?> +]]> + </programlisting> + </example> + これは期待通りに動作します。なぜなら、PHP は ?&gt; 終了タグを見つけると + それ以降新たに開始タグを見つけるまでの内容を何でも出力するからです。 + 確かにこの例には少し無理があります。しかし、大量のテキストを出力する際に + <function>echo</function> や <function>print</function> を用いることを + 考えると、このように一度 PHP のパースモードを抜けるほうが効率的です。 </para> - <para> - PHPでサポートされるタグは以下のとおりです: + PHP で用いられるタグは 4 種類あります。 + これらのうちの 2 つ、&lt;?php ?&gt; と + &lt;script language="php"&gt; &lt;/script&gt; は常に使用することができます。 + 残りの 2 つは短縮型のタグと <productname>ASP</productname> スタイルの + タグで、これらは &php.ini; ファイルによって有効か無効かを切り替えられます。 + 中には短縮型のタグや <productname>ASP</productname> スタイルのタグを + 便利に感じる人がいるかも知れませんが、長いタグに比べると移植性に欠けます。 + また一般的には推奨されていません。 + <note> + <para> + さらに注意しなければならないことがあります。PHP コードを XML や XHTML に + 埋め込む場合には、標準規格に従うために &lt;?php ?&gt; タグを使用する + 必要があるでしょう。 + </para> + </note> </para> - <para> <example> - <title>HTMLからの脱出法</title> + <title>PHP の開始タグと終了タグ</title> <programlisting role="php"> <![CDATA[ -1. <?php echo("XHTMLまたはXMLドキュメントを処理したい場合は、この方法が良いでしょう\n"); ?> +1. <?php echo 'XHTMLまたはXMLドキュメントを処理したい場合は、この方法が良いでしょう'; ?> -2. <? echo ("この方法は最も簡単で、SGMLの処理命令です\n"); ?> - <?= expression ?> は "<? echo expression ?>"のショートカットです。 - -3. <script language="php"> - echo ("(FrontPageのような) いくつかのエディタ は処理命令を好み - ません"); +2. <script language="php"> + echo '(FrontPageのような) いくつかのエディタ は処理命令を好み + ません'; </script> -4. <% echo ("オプションでASP形式のタグを使用可能です"); %> +3. <? echo 'これは、SGML を処理する最もシンプルな方法です'; ?> + <?= expression ?> This is a shortcut for "<? echo expression ?>" + +4. <% echo 'オプションでASP形式のタグを使用可能です'; %> <%= $variable; # これは、"<%echo .." のショートカットです。%> ]]> </programlisting> </example> </para> - <para> - 最初の方法が推奨されます。なぜなら、 - XHTMLのようなXMLに適応したコードでPHPを使用できるからです。 + 例の 1. と 2. のタグは常に利用可能です。中でも 1. のタグは最も一般的で + 推奨される方法です。 </para> - <para> - 2番目の方法は、短縮型のタグが有効な場合にのみ利用可能です。 - 短縮型のタグは、<function>short_tags</function> 関数を使用するか - (PHP 3のみ)、 PHPの設定ファイルに - <link linkend="ini.short-open-tag">short_open_tag</link>を設定する - か--enable-short-tags オプションを <command>configure</command> に - 指定して PHP をコンパイルすることにより、有効にできます。 - php.ini-distでは、デフォルトでこのオプションは有効となっていますが、 - 短縮形のタグの使用は推奨されません。 - </para> - + 短縮型のタグ(例 3.)が有効なのは、&php.ini; 設定ファイルのディレクティブ + <link linkend="ini.short-open-tag">short_open_tag</link> が + 有効になっている場合か PHP が <option>--enable-short-tags</option> + オプションつきで configure されている場合のみです。 + <note> + <para> + PHP 3 では、<function>short_tags</function> 関数を用いて + 短縮型のタグを有効にすることもできます。<emphasis>これは + PHP 3 でのみ有効な方法です!</emphasis> + </para> + </note> + </para> <para> - 4番目の方法は、ASP型式のタグが - <link linkend="ini.asp-tags">asp_tags</link> の設定により有効となっ - ている場合にのみ使用可能です。 - + <productname>ASP</productname> 型のタグ(例 4.)が有効なのは、 + &php.ini; 設定ファイルのディレクティブ + <link linkend="ini.asp-tags">asp_tags</link> が有効になっている場合のみです。 <note> <para> - ASP 型のタグのサポートは、3.0.4で追加されました。 + <productname>ASP</productname> 型のタグのサポートは、3.0.4 で追加されました。 </para> </note> </para> - <note> <para> 再利用されるか、または、自分の制御下にないPHPサーバで運用される @@ -136,130 +126,93 @@ ようにしてください。 </para> </note> - - <para> - ブロックの終了タグは、直後に改行がある場合、それを含んだものになります。 - また、終了タグには自動的にセミコロンが含まれていると認識されます。 - 従ってPHPコードの最終行にはセミコロンを記述する必要はありません。 - ファイル終端におけるPHPブロックの終了タグはオプション(任意)です。 - </para> - - <para> - PHP は、次のような構造を使用可能です。 - <example><title>高度なエスケープ処理</title> - <programlisting role="php"> -<![CDATA[ -<?php -if ($expression) { - ?> - <strong>This is true.</strong> - <?php -} else { - ?> - <strong>This is false.</strong> - <?php -} -?> -]]> - </programlisting> - </example> - - このコードは期待通りに動作します。これは、PHPが?&gt; および - &lt;?phpの中のテキストを<function>echo</function>命令として処理す - るためです。この例はもちろん不自然なものですがPHPモードを抜ける - ことでテキストを出力させる方法は、それらを<function>echo</function> - や<function>print</function>等を使って出力させるより便利です。 - </para> </sect1> - <sect1 id="language.basic-syntax.instruction-separation"> <title>命令の分離</title> - - <simpara> - 命令は、C や Perl と同様に分離されます。つまり、各文はセミコロンで - 終了します。 - </simpara> - <para> - 閉じるタグ (?&gt;) も文の終わりの意味を有します。このため、以下の - 文は等価です。 - + C や Perl と同様に、PHP でもステートメントを区切りにはセミコロンが必要と + なります。PHP コードブロックの終了タグには自動的にセミコロンが含まれていると + 認識されます。 従って PHP コードの最終行にはセミコロンを記述する必要はありません。 + ブロックの終了タグは、直後に改行がある場合、それを含んだものになります。 <informalexample> <programlisting role="php"> <![CDATA[ <?php - echo "This is a test"; + echo 'テストです'; ?> -<?php echo "This is a test" ?> +<?php echo 'テストです' ?> ]]> </programlisting> </informalexample> - </para> + <note> + <para> + ファイル終端における PHP ブロックの終了タグはオプション(任意)です。 + 出力バッファリングと <function>include</function> や + <function>require</function> を利用する際にはこの機能を使わないほうが + 無難です。 + </para> + </note> + </para> </sect1> - <sect1 id="language.basic-syntax.comments"> - <title>コメント</title> - + <title>コメント</title> <para> - PHP は、'C', 'C++' および Unix シェル型のコメントをサポートします。 + PHP は、'C', 'C++' および Unix シェル型(Perl 型)のコメントをサポートします。 例えば、 <informalexample> <programlisting role="php"> <![CDATA[ <?php -echo "This is a test"; // C++型の単一行用のコメント +echo 'テストです'; // C++型の単一行用のコメント /* 複数行用のコメント もう一行分のコメント */ -echo "This is yet another test"; -echo "One Final Test"; # シェル型のコメント +echo 'もうひとつのテストです'; +echo '最後のテストです'; # シェル型のコメント ?> ]]> </programlisting> </informalexample> </para> - <simpara> - "一行"コメントは、改行またはPHPコードのブロックの終わり + "一行"コメントは、改行または PHP コードのブロックの終わり のうちどちらか最初にくる方までです。 + つまり、<literal>// ?&gt;</literal> の後に続く HTML コードは + 表示されるということです。?&gt; により PHP モードから抜け出して + HTML モードに戻ると、そこでは <literal>//</literal> は何の影響も + 及ぼしません。<link linkend="ini.asp-tags">asp_tags</link> + 設定ディレクティブが有効になっている場合、<literal>// %&gt;</literal> + でも同じような動作になります。しかし、一行コメントの中の + <literal>&lt;/script&gt;</literal> では PHP モードから抜け出すことは + ありません。 </simpara> <informalexample> <programlisting role="php"> <![CDATA[ -<h1>This is an <?php # echo "simple";?> example.</h1> -<p>The header above will say 'This is an example'. +<h1>これは <?php # echo 'シンプルな';?> 例です。</h1> +<p>上の見出しは 'これは例です。' となります。 ]]> </programlisting> </informalexample> - <simpara> - 'C'型のコメントがネストしないように注意する必要があります。 + 'C' 型のコメントは、最初に <literal>*/</literal> が現れた時点で終了します。 + 'C' 型のコメントがネストしないように注意する必要があります。 ネストは、大きなブロックをコメントアウトする際に生じます。 </simpara> - - <informalexample> - <programlisting role="php"> + <para> + <informalexample> + <programlisting role="php"> <![CDATA[ <?php /* - echo "This is a test"; /* このコメントが問題を生じます */ + echo 'テストです'; /* このコメントが問題を生じます */ */ ?> ]]> - </programlisting> - </informalexample> - - <simpara> - 1行単位のコメント形式は、実際には、改行またはPHPコードブロックの - 終わりのどちらか最初に来た方までをコメントとします。 - これは、<literal>// ?&gt;</literal> の後にHTMLコードが来ると - 表示されることを意味します。 - ?&gt; は、PHPモードをスキップし、HTMLモードに戻します。 - <literal>//</literal> は影響を与えません。 - 設定ディレクティブ <link linkend="ini.asp-tags">asp_tags</link> が - 有効な場合、<literal>// %&gt;</literal> が指定されても同じ動作となります。 - </simpara> + </programlisting> + </informalexample> + </para> </sect1> </chapter>
« previous php.doc.ja (#1094) next »