2009年04月18日
PHP5からPHP4に書き換える場合。
ローカルサーバーで開発して、いざ実働環境で実行しようと思ったらPHPのバージョンが違った!なんてことは無いでしょうか。いや、確かに使用するサーバーに入ってるPHPのバージョンくらい調べておくのが普通なんですが、万が一、うっかりしてたなんてことが起こり得るんじゃないでしょうか。・・・無い?そう?
ちなみにぼくは過去2回やりました。しかも両方、ローカル=PHP5、リモート=PHP4のパターン。そんなわけでPHP5からPHP4に書き換える際の注意点をまとめてみようと思います。
詳細は続きから。
主にDOM関係の話題だったりします。
コンストラクタ
PHP4と5ではコンストラクタの書き方が違います。
class ClassName { // PHP4 function ClassName() { } // PHP5 public function __construct() { } }
ちなみにPHP5ではPHP4形式でも互換性があります。
アクセス修飾子
PHP4では「public」や「private」などのアクセス修飾子は使えません。
public function publicMethod() { // ←エラーになる }
XMLファイルの読み込み
PHP4ではDOMDocumentオブジェクトではなく、DOMXmlオブジェクトを使う必要があります。まず、XMLファイルの読み込みはこんな感じ。
// PHP4 $dom = domxml_open_file($filename); // PHP5 $dom = new DOMDocument('1.0', 'utf-8'); $dom->load($filename);
DOM関数の書き換え
関数名はキャメル式からハイフン式になります。一部例外もありますが、たいていはこのパターンで書き換えられます。
// PHP4 $elem = $dom->first_child(); // PHP5 $elem = $dom->firstChild();
また、domxml->get_element_by_id()はうまく動作しないので、使う場合は自分で関数を定義する必要があります。ちなみに、PHP5でもDOMDocument->getElementById()は挙動不審なので、自分で定義することになります。
// PHP4 function getElementById($doc, $id, $node = null) { if ($node === null) { return getElementById($doc, $id, $doc->document_element()); } $children = $node->child_nodes(); foreach($children as $elem) { if (!($elem->type == XML_ELEMENT_NODE)) { continue; } if ($elem->get_attribute('id') == $id) { return $elem; } $ret = getElementById($doc, $id, $elem); if ($ret !== null) { return $ret; } } return null; } // PHP5 function getElementById(DOMDocument $doc, $id, DOMNode $node = NULL) { if ($node === NULL) { return getElementById($doc, $id, $doc->documentElement); } $children = $node->childNodes; for ($i = 0; $i < $children->length; ++$i) { $elem = $children->item($i); if (!($elem instanceof DOMElement)) { continue; } if ($elem->getAttribute('id') == $id) { return $elem; } $ret = getElementById($doc, $id, $elem); if ($ret !== NULL) { return $ret; } } return NULL; }
メソッドチェーンは使えない
PHP4ではPHP5でできるようなメソッドチェーンは使えません。あるメソッドを使って取得したオブジェクトから、さらにメソッドを呼び出す場合は、一度変数にオブジェクトを落とす必要があります。
// PHP4 $parent = $elem->parent_node(); $parent->remove_child($elem); // PHP5 $elem->$parentNode()->removeChild($elem);
気づいたところでは、だいたいこんな感じでしょうか。
クリック動作を無効にするジョークブックマークレット
文字サイズを拡大縮小するスクリプト
ダブルクリックでスクロールするスクリプト
電卓を表示するブックマークレット
ごくごく一部の顔文字を絵文字に置き換えるスクリプト
あとは、関数の引数が変わっていたりするから、そのあたりを気をつける感じかな。

domxml->create_element($nodename) なんかがそうですね。
