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);

気づいたところでは、だいたいこんな感じでしょうか。



タグ :PHP

同じカテゴリー(プログラミング)の記事画像
GoogleReaderを3ペイン表示にするスクリプトのα版
文字サイズを拡大縮小するスクリプト
電卓を表示するブックマークレット
Twitterで費やした時間を表示するスクリプト
ニコニコのタグをプレビューするスクリプト
ニコニコで広告を消すスクリプト
同じカテゴリー(プログラミング)の記事
 GoogleReaderを3ペイン表示にするスクリプトのα版 (2009-07-26 22:00)
 クリック動作を無効にするジョークブックマークレット (2009-07-19 23:52)
 文字サイズを拡大縮小するスクリプト (2009-07-12 18:09)
 ダブルクリックでスクロールするスクリプト (2009-07-05 14:22)
 電卓を表示するブックマークレット (2009-06-27 21:40)
 ごくごく一部の顔文字を絵文字に置き換えるスクリプト (2009-05-21 23:06)
Posted by Handle at 13:17│Comments(3)プログラミング
この記事へのコメント
二重投稿?

あとは、関数の引数が変わっていたりするから、そのあたりを気をつける感じかな。
Posted by CTOCTO at 2009年04月18日 14:21
> CTO さん

domxml->create_element($nodename) なんかがそうですね。
Posted by HandleHandle at 2009年04月19日 09:33
ロレック時針各種海外有名ブランド品を豊富に取り揃え、しかもお客様を第一と考えて、驚きの低価格で提供しております。税関の没収する商品は再度無料にして発送します。広大な客を歓迎して買います!3-6日にきっと引き渡す.スーパーコピーブランド時計 }}}}}}
https://www.bagssjp.com/menu/menu_product-46.html
https://www.bagssjp.com/product/detail-9461.html
https://www.bagssjp.com/product/detail-11902.html
https://www.bagssjp.com/product/detail-10864.html
https://www.bagssjp.com/product/detail-9865.html
Posted by stowits at 2023年06月04日 01:57
コメントフォーム
上の画像に書かれている文字を入力して下さい
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。