残り一年! PHP4からPHP5への移行

第4回モジュール関連の違い

今回はモジュール関連の違いについて解説します。PHP5ではXML関連モジュールの入れ替えや新しいXML関連モジュールのデフォルト化など、XML関連で大きく変わっています。ほかにもPECLプロジェクトに移動されソースディストリビューションに含まれなくなったモジュール、廃止されたモジュールなどもあります。これらについて解説します。

特に記述がない場合、PHP4はPHP4.4.x、PHP5はPHP5.2.xを意味します。

XML関連の違い

PHP4もXML関連のモジュールが用意されていました。PHP4とPHP5で互換性があるXML関連モジュールはSAXパーサとXML RPCモジュールで、ほかのモジュールは互換性がありません。PHP5では同じ機能を提供する別のモジュールが用意されていたり、新しいインターフェースが用意されています。

機能PHP4PHP5
SAXパーサXML ParserXML Parser
DOM関数DOM_XMLDOM
XSLT変換XSLTXSL
XML RPC関数XML_RPCXML_RPC
SOAP関数N/ASOAP
libxml関数N/Alibxml
簡易XML文書アクセスN/ASimpleXML
XMLプルパーサN/AXMLReader
サービスデータオブジェクトN/ASDO
XML Data Access Service for Service Data ObjectsN/ASDO XML Data Access Service

PHP5は簡単にXML文書にアクセスできるSimpleXMLなど、XML機能が強化されています。しかし、PHP4とPHP5のXML機能には大きな違いがあるので移行には困難を伴うケースも多いと思います。ここでは違いの概要を解説しています。詳しくはPHPマニュアルを参照してください。

DOM関数

DOM(DocumentObjectModel)はXMLドキュメントへのアクセス仕様であるため、モジュールが提供するAPIは似てはいますが、互換性はありません。しかし、DOM API自体は言語に依存しないAPI定義であるため、関数名を変えるだけで同じ動作をするものも多くあります。

DOM XMLモジュール関数(PHP4)
関数機能
DomDocument->create_commentCreate new comment node
DomDocument->create_element_nsCreate new element node with an associated namespace
DomDocument->create_elementCreate new element node
DomDocument->create_entity_referenceCreate an entity reference

出典:PHPマニュアル

DOMモジュール関数(PHP5)
関数機能
DOMDocument->createComment()Create new comment node
DOMDocument->createDocumentFragment()Create new document fragment
DOMDocument->createElement()Create new element node
DOMDocument->createElementNS()Create new element node with an associated namespace
DOMDocument->createEntityReference()Create new entity reference node

出典:PHPマニュアル

定数名はDOMとDOM XMLモジュールで互換性があります。

XML_ELEMENT_NODE
XML_ATTRIBUTE_NODE
XML_TEXT_NODE
XML_CDATA_SECTION_NODE

このように、DOMとDOM XMLモジュールで同じ名前の定数を同じ意味で利用しています。DOM関数を利用していてもPHP4からPHP5への移行はそれほど困難ではないと思います。

SXLT変換

XSLTサポートモジュールはPHP4とPHP5では大きく変更されています。PHP4のXSLTサポートモジュール(XSLT)はSablotronライブラリを利用していますが、PHP5のXSLTサポートモジュールのXSLモジュールはlibxlstライブラリを利用しています。

PHP4のXSLTモジュールのAPIは関数で提供されいます。PHP5ではオブジェクト指向プログラミングサポートの向上の一環としてXSLモジュールのAPIはクラスとして提供しています。ベースとなっているライブラリも異なりAPIも異なっているので、互換性は全くありません。XSLTを利用されている場合はコードの大幅な書き換えが必要です。

XSLTモジュール(PHP4)
関数機能
xslt_backend_infoReturns the information on the compilation settings of the backend
xslt_backend_nameReturns the name of the backend
xslt_backend_versionReturns the version number of Sablotron
xslt_createCreate a new XSLT processor
xslt_errnoReturns an error number
xslt_errorReturns an error string
xslt_freeFree XSLT processor
xslt_getoptGet options on a given xsl processor
xslt_processPerform an XSLT transformation
xslt_set_baseSet the base URI for all XSLT transformations
xslt_set_encodingSet the encoding for the parsing of XML documents
xslt_set_error_handlerSet an error handler for a XSLT processor
xslt_set_logSet the log file to write log messages to
xslt_set_objectSets the object in which to resolve callback functions
xslt_set_sax_handlerSet SAX handlers for a XSLT processor
xslt_set_sax_handlersSet the SAX handlers to be called when the XML document gets processed
xslt_set_scheme_handlerSet Scheme handlers for a XSLT processor
xslt_set_scheme_handlersSet the scheme handlers for the XSLT processor

出典:PHPマニュアル

XSLモジュール(PHP5)
関数機能
XSLTProcessor->__construct()Creates a new XSLTProcessor object
XSLTProcessor->getParameter()Get value of a parameter
XSLTProcessor->hasExsltSupport()Determine if PHP has EXSLT support
XSLTProcessor->importStylesheet()Import stylesheet
XSLTProcessor->registerPHPFunctions()Enables the ability to use PHP functions as XSLT functions
XSLTProcessor->removeParameter()Remove parameter
XSLTProcessor->setParameter()Set value for a parameter
XSLTProcessor->transformToDoc()Transform to a DOMDocument
XSLTProcessor->transformToURI()Transform to URI
XSLTProcessor->transformToXML()Transform to XML

出典:PHPマニュアル

PHP本体に付属するモジュール違いのまとめ

PHP5のモジュールはPHP4のモジュールとかなり異なっています。PECLに移動したモジュールなどが多くあります。次の表はPHP4からPHP5のモジュールの違いのまとめた表になります。モジュール名はPHPマニュアルと同じ表記ではなく、モジュールのディレクトリ名を利用しました。これはComと.Net関数のように内部的には全く別のモジュールを利用しインターフェースも異なる場合でも、マニュアルでは同じページで記載されているからです。

PHP5で削除またはPECLに移動したモジュール

モジュール移動先
comCOM dotnetが代替モジュール
cpdfCPDF PECLへ移動
crackCrack PECLへ移動
cyrusCyrus PECLへ移動
dbDb PECLへ移動
dbxDbx PECLへ移動
dioDIO PECLへ移動
domxmlDOMXML PHP5では動作しない
fileproFilePro PECLへ移動
fribidiFribidi PECLへ移動
hwapiHyperwave API PECLへ移動
hyperwareHyperware PECLへ移動
infomixInformix PECLへ移動
ingres_iiIngress II PECLへ移動
ircgIRC Gateway PECLへ移動
javaJava 代替モジュールなし
mcalMCAL 代替モジュールなし
mcveMCVE PECLへ移動
mnogosearchmnoGoSearch PECLへ移動
msessionMohawk Software Session Handler PECLへ移動
notesLotus Notes PECLへ移動
oracleOracle oci8が代替モジュール
overload機能がPHP5本体に吸収されました
pdfPDF PECLへ移動
pfproVerisign Payflow Pro PECLへ移動
qtdomQt DOM PECLへ移動
swfShackwave Flash PECLへ移動
w32apiW32api PECLへ移動
xsltXSLが代替モジュール
yazYAZ PECLへ移動
ypYP/NIS PECLへ移動

PHP5から追加されたモジュール

モジュール機能
dotnet.NET COMモジュールの代替
domDOM DOMXMLモジュールの代替
filterFilter
hashHash
jsonJSON
libxmlLibXML
mysqliMySQL Improved
pdoPHP Data Object
reflectionReflection API
simplexmlSimpleXML
soapSOAP
splStandard PHP Library
sqliteSQLite
tidyTidy
xmlreaderXML Reader
xmlwriterXML Writer
xslxlstの代替モジュール

移行時に注意が必要な関数

以下の関数はPHP4とは異なる動作をします。

関数機能
strrposneedleが最初の1文字でなく文字列全体がニードルとなる。不正なオフセットでNoticeエラーが発生する。
strriposneedleが最初の1文字でなく文字列全体がニードルとなる。不正なオフセットでNoticeエラーが発生する。
strtotime失敗した場合の戻り値が-1ではなくFALSEを返す。タイムゾーンエラーでE_STRICTとE_NOTICEエラーが発生する。タイムゾーンが設定されていないとE_STRICTエラーが発生する。
array_merge引数が配列型のみを受け付けるように変更された。
get_class, get_parent_class, get_class_methodsクラス、メソッド名が定義された状態のまま返される。
ip2long不正なIPアドレスが渡された場合、-1ではなくFALSEを返す。
include_once, require_once(Windows)A.php、a.phpなど、ファイル名の大文字・小文字が異なっても一度のみファイルを読み込む。
getrusage不正なパラメータが渡された場合、配列ではなくNULLを返す。
mb_strrposoffsetパラメータが追加され、古いシグニチャの利用は推奨されなくなった。
pg_escape_string, pg_escape_bytea, mysql_real_escape_string接続パラメータが追加された(次回にセキュリティ関連の変更として紹介します⁠⁠。

エラーイベント

PHP4と比べ、PHP5は不正な引数や使用方法でエラーが発生するようになっています。例えば、bzip2モジュールのアーカイブオープン関数を「bzopen("", "w")」のように空のファイル名を指定するとE_WARNINGエラーが発生します。このようなエラーチェックの強化は多数の関数で実施されています。

これらのエラーの多くはバグやパラメータのチェック不足で発生すると思われますが、エラーハンドラですべてのエラーでスクリプトの実行を停止している場合はエラーが発生するコードの修正またはエラーハンドラの修正が必要となる場合もあります。

まとめ

特にPHP4でXML関連の操作を行うアプリケーションを構築している場合、単純にPHP5に移行することができないアプリケーションも多いと思います。

PHP5はソースディストリビューションに含められていた多くのモジュールをPECLに移動しています。モジュールの違いはPHP5へ移行する場合の最も大きな障害となるケースも多いので注意が必要です。

次回はセキュリティに関連した変更を紹介します。

おすすめ記事

記事・ニュース一覧