hirokawa Sat Feb 3 17:04:36 2001 EDT
Added files:
/phpdoc/ja/appendices migration4.xml
Modified files:
/phpdoc/ja/appendices debugger.xml
Log:
added migration4.xml in japanese tree.
Index: phpdoc/ja/appendices/debugger.xml
diff -u phpdoc/ja/appendices/debugger.xml:1.3 phpdoc/ja/appendices/debugger.xml:1.4
--- phpdoc/ja/appendices/debugger.xml:1.3 Fri Sep 15 18:27:36 2000
+++ phpdoc/ja/appendices/debugger.xml Sat Feb 3 17:04:36 2001
@@ -1,6 +1,16 @@
<appendix id="debugger">
<title>PHPデバッガ</title>
+ <sect1 id="debugger-about">
+ <title>デバッガについて</title>
+ <simpara>
+ PHP 3
+ではネットワーク対応のデバッガがサポーされています。
+ </simpara>
+ <simpara>
+ PHP 4 ではまだ同様の機能はサポートされていません。
+ </simpara>
+ </sect1>
+
<sect1 id="debugger-using">
<title>デバッガの使用法</title>
@@ -45,12 +55,6 @@
力を抑制しても、有効のままです。
</emphasis>
</para>
- <note>
- <para>
-
現時点でデバッガ用のコードはPHP4にポートされておらず、PHP3のみが
- デバッガコードをサポートしています。
- </para>
- </note>
</sect1>
<sect1 id="debugger-protocol">
Index: phpdoc/ja/appendices/migration4.xml
+++ phpdoc/ja/appendices/migration4.xml
<appendix id="migration4">
<title>PHP 3.0からPHP 4.0への移行</title>
<section>
<title>PHP 4.0での変更点</title>
<para>
PHP 4.0 とこれに組み込まれた Zend
エンジンは、PHPの性能と機能を大
幅に向上させますが、既存のコードへの変更は最小限ですむように多くの
考慮がなされています。このため、PHP 3.0 から 4.0
への移行は、
PHP/FI 2.0 から PHP 3.0
への移行と比べて非常に容易です。既存の PHP
3.0
のコードの多くは無修正で実行可能です。しかし、実用環境でバージョ
ンを切替える際には、バージョン間の若干の差異を知り、使用するコード
について確認を行うことが必要です。以下の記述は、これらの事項につい
ていくつかの示唆を与えるものです。
</para>
</section>
<section>
<title>パーサの動作</title>
<para>
パーサと実行は、二つの完全に分割されたステップになりました。ファイ
ル中のコードの実行は、ファイル全体と必要なものが全て完全にパースさ
れるまで行われません。
</para>
<para>
この分割により PHP 4では
requireやincludeで読み込まれるファイルが
構文的に完全であることが新たに必要となっています。PHP
4では、制御
構造の異なる制御部をファイル境界をまたいで配置することはできません。
このため、<literal>for</literal> ループまたは
<literal>while</literal>ループ、<literal>if</literal> 命令または
<literal>switch</literal>ブロックをあるファイルで開始し、
<literal>else</literal>、<literal>endif</literal>,
<literal>case</literal>、<literal>break</literal> 命令を別のファイ
ルに置くことはできません。
</para>
<para>
ループまたは他の制御構造の中で追加のコードを読み込むことは、PHP
4
では、全く問題ありません。制御用のキーワードや対応する波括弧
<literal>{...}</literal>
だけは、同じコンパイル単位(ファイルまたは
<function>eval</function>された文字列)の中に置く必要があります。
</para>
<para>
しかし、配布されているコードではこうした記法は非常に悪いスタイルで
あるとみなされているようなので、この制約の影響は大きくないはずです。
</para>
<para>
使用ができなくなった他の機能としては、PHP 3.0
ではほとんど使用され
ていませんが、requireで読みこまれたファイルから値を返すというもの
があります。includeで読み込まれたファイルから値を返すことは
PHP
4.0 でも可能です。
</para>
</section>
<section>
<title>エラー出力</title>
<section>
<title>設定変更</title>
<para>
PHP 3.0
では、エラー出力レベルは異なったエラーレベルを意味する数
を合計した単純な数値で表されていました。よく使用されるのは、全て
のエラーと警告を出力する15と好ましくない形式や事項を通知するメッ
セージ以外の全てを出力する7です。
</para>
<para>
PHP 4.0
では、より多くの異なったエラーおよび警告レベルを設定して
おり、設定ファイルにおいて意図する動作を設定するために定数シンボ
ルを使用することが可能になっています。
</para>
<para>
エラー出力レベルは、出力したくないエラーメッセージの警告レベルを
定数シンボル <literal>E_ALL</literal>
と排他的論理和をとることに
より明示的に取り除くことにより指定することも可能になっています。
解りにくいでしょうか? では、ここで定数シンボル
<literal>E_NOTICE</literal> に分類される簡単な警告以外のエラー出
力を行うように設定したい場合を考えます。この場合、
<filename>php.ini</filename>において次のような指定を行います。
<literal>error_reporting = E_ALL & ~ ( E_NOTICE )</literal>
ここでさらに警告の出力を行わないようにしたい場合は、次のように括
弧の中でバイナリまたは演算子'|'を使用して適当な定数を追加します。
<literal>error_reporting= E_ALL & ~ ( E_NOTICE | E_WARNING
)</literal>
</para>
<warning>
<para>
従来の値7および15を使用してエラー出力を設定する方法は、パースエ
ラーを含む新たに追加されたエラークラスのいくつかが使用できなくな
るため、非常に悪い方法です。この場合、スクリプトが動作しない場合
でもエラーメッセージをどこにも表示しないため、非常に奇妙な動作と
なることがあります。
</para>
<para>
これにより、過去において、原因を追求が困難なスクリプトエンジンの
問題と報告された多くの再現不可能なバグレポートが、実際には、
requireで読み込まれたファイルにいくつかの '}'
が足りず、エラー出
力の設定を誤っていたためにパーサがエラーを出力できなかったという
ことがあります。
</para>
<para>
このため、スクリプトが何も出力せずに終了する場合、エラー出力設定
をまず確認するべきです。現在のZend
エンジンは十分に完成されてお
り、この種の奇妙な動作を発生しません。
</para>
</warning>
</section>
<section>
<title>追加された警告メッセージ</title>
<para>
既存のPHP
3.0コードの多くは、このコードのように非常に悪いスタイル
の言語構造を使用しており、意図された通りに動作している場合でも、
他の部分を変更すると動作しなくなることがあります。PHP
4.0は、PHP
3.0が出力しないような場面でも多くの通知メッセージを出力します。
E_NOTICEメッセージをオフにすれば簡単に修正できますが、通常は問題
のあるコードを修正する方が良いでしょう。
</para>
<para>
通知メッセージが出力される場面で最も多いのが、引用符で括られてい
ない文字列定数を配列の添字として使用している場合です。その名前の
キーワードまたは定数が存在しない場合、PHP 3.0 と
4.0は共にこれら
を文字列として解釈し直します。しかし、そのコードのどこか他の場所
でその名前の定数が定義されている場合、このスクリプトは意図した通
りに動作しない可能性があります。これは、侵入者が文字列定数を再定
義して使用されるスクリプトが侵入者が有さないアクセス権を侵入者に
与えるようにする場合には、セキュリティのリスクとなることさえあり
ます。そこで、PHP 4.0 では、例えば、
<literal>$HTTP_SERVER_VARS[REQUEST_METHOD]</literal> のように引用
符で括られていない文字列定数を使用した場合に警告を発生するように
なっています。これを
<literal>$HTTP_SERVER_VARS['REQUEST_METHOD']</literal> に変更する
ことにより、パーサは正常に動作し、コードのスタイルとセキュリティ
は大幅に改善されます。
</para>
<para>
その他、PHP 4.0
では初期化されていない変数または配列要素を使用し
ていることを知らせるようになっています。
</para>
</section>
</section>
<section>
<title>イニシャライザ</title>
<para>
静的変数とクラスメンバのイニシャライザは、PHP
3.0では有効な式なら
ばなんでも指定可能でしたが、PHP
4.0ではスカラー値のみが指定可能で
す。これは、前記のようにパースと実行が分割されており、パーサがイニ
シャライザを処理する際にはまだコードは実行されていないためです。
</para>
<para>
クラスの場合、メンバ変数を初期化する際にはコンストラクタを使用する
べきです。静的変数の場合、単純なスカラー値以外のものに意味があるこ
とはまれです。
</para>
</section>
<section>
<title><literal>empty("0")</literal></title>
<para>
恐らく最も動作上の問題のある変更は、<function>empty</function>の動
作に関するものでしょう。文字 '0'
(ゼロ)のみを含む文字列は、PHP 3.0
とは異なり空文字列とみなされるようになりました。
</para>
<para>
数値の入力が要求された場合でも全てのinputフィールドは文字列を返し、
PHPは自動的に型変換を行う機能を有しているため、この動作の変更は、
Webアプリケーションにおいて有意義なものです。しかし、一方、コード
の正常動作を阻害する可能性があり、動作の内容を知らない場合には、
原因を追求しがたい動作の不備を生じる可能性があります。
</para>
</section>
<section>
<title>廃止された関数</title>
<para>
PHP 4.0
は多くの新しい機能と拡張を導入していますが、同時にいくつか
のバージョン3.0
の関数は廃止されています。コア関数のいくつかは、
Zendエンジンを使用する4.0で導入されたパーサと実行モジュールの分割
という新たな形態では動作しないため、廃止されています。他の関数や拡
張機能全体もより新しい関数や拡張が同じタスクをより良くより一般的な
手法で行うため古くなっています。いくつかの関数は単にまだ移植されて
いないだけであり、いくつかの関数や拡張はライセンス上の問題により廃
止されています。
</para>
<section>
<title>コンセプトの変更により廃止された関数</title>
<para>
PHP 4.0
ではパースと実行が分割されており、実行時に(現在、Zendエン
ジンに組み込まれている)パーサの動作を変更することは、パースが実行
前に既に行われているため、もうできません。
<filename>php.ini</filename>
ファイルで適当な値を設定することによ
りパーサの動作を変更することが可能です。
</para>
<para>
PHP 3.0の機能で PHP 4.0 でサポートされていない機能としては、
このマニュアルで記述されている実験的なデバッグインターフェースの
サポートがあります。独立した本格的なデバッガがZendの製品としてリ
リースされています。
</para>
</section>
<section>
<title>推奨されない関数と拡張Deprecate functions and extensions</title>
<para>
Adabas および Solid
データベース拡張は、もはや推奨されません。
今後は、unified ODBC 拡張を代わりに使用して下さい。
</para>
</section>
<section>
<title><function>unset</function>のステータスの変更</title>
<para>
<function>unset</function>はまだ使用可能ですが、PHP 4.0ではリテラ
ルとして実装されるように変更されており、このため、'真の'関数とし
てはもはや数えられていません。
</para>
<para>
これは、<function>unset</function>
の動作を変更するものではないの
で、直接的な変更点があるわけではありませんが、
<function>function_exists</function> により "unset" を調べた場合、
<function>echo</function>のような他の低レベル関数と同様に
<literal>false</literal> が返されます。
</para>
<para>
その他のより実際的な変更としては、<function>unset</function>
を間
接的にコールすることができなくなったというものがあります。このた
め、<literal>$func="unset"; $func($somevar)</literal> はもう動作
しません。
</para>
</section>
</section>
<section>
<title>PHP 3.0 拡張機能</title>
<para>
PHP 3.0 用に描かれた拡張は、PHP 4.0
ではバイナリレベルでもソースレ
ベルでも動作しません。元のソースにアクセス可能な場合、PHP
4.0にそ
の拡張モジュールを移植することは困難ではありません。実際の移植の手
順についての詳細な説明はこの文章には(まだ)含まれていません。
</para>
</section>
<section>
<title>文字列中の変数置換</title>
<para>
PHP 4.0
では文字列中の新しい変数置換の機構が追加されています。文字
列中の多次元配列からオブジェクトのメンバ変数と要素にアクセスが可能
となっています。
</para>
<para>
これを行うには、開き括弧の直後にドル記号が付くように変数を波括弧で
括る必要があります。
<literal>{$...}</literal>
</para>
<para>
オブジェクトのメンバ変数の値を文字列に埋め込むには、
<literal>"text {$obj-<member} text"</literal> とします。一方、PHP
3.0 では、<literal>"text ".$obj-<member." text"</literal> のよ
うにする必要がありました。
</para>
<para>
これによりコードの可読性が高まりますが、PHP
3.0用に描かれた既存の
スクリプトは動作しなくなる可能性があります。しかし、コード中の
<literal>{$</literal>
という文字の組み合わせを調べることにより容易
にこの種の問題の確認が可能で、任意の検索/置換ツールにより
<literal>\{$</literal> に置換することにより対処可能です。
</para>
</section>
<section>
<title>クッキー</title>
<para>
PHP 3.0 は、コード中の<function>setcookie</function>のコールとは逆
の順番でクッキーを設定するという好ましくない動作をしていました。
PHP 4.0
はこの動作を変更し、コードでクッキーを設定したのと同じ順番
で正しくクッキーを設定するヘッダ行を生成します。
</para>
<para>
これによりいくつかの既存のコードが動作しなくなる可能性がありますが、
従来の動作は理解しにくく、将来的な更なる問題を防ぐために変更望まれ
ていました。
</para>
</section>
</appendix>
<!-- 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
sgml-parent-document:nil
sgml-default-dtd-file:"../../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->