【PHP8.x】DOMProcessingInstruction::isConnectedプロパティの使い方
isConnectedプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『isConnectedプロパティは、DOMProcessingInstructionオブジェクトがドキュメントツリーに接続されているかどうかを示す真偽値(bool)を保持するプロパティです。このプロパティの値が true となるのは、その処理命令ノードが DOMDocument オブジェクトの一部として、実際にドキュメント内に配置されている場合です。例えば、appendChild() や insertBefore() などのメソッドを使ってドキュメントに追加されたノードは、接続された状態と見なされます。反対に、new DOMProcessingInstruction() でインスタンスを作成した直後や、removeChild() メソッドによってドキュメントから削除されたノードは、どのドキュメントにも属していないため、このプロパティは false を返します。このプロパティを参照することで、特定の処理命令が現在ドキュメントの有効な構成要素であるかを簡単に確認できます。なお、このプロパティは読み取り専用のため、開発者が直接値を変更することはできず、ノードの状態に応じて自動的に値が更新されます。
構文(syntax)
1<?php 2 3$doc = new DOMDocument(); 4$pi = $doc->createProcessingInstruction('php-version', '"8"'); 5 6// ノードがドキュメントに追加される前は false 7var_dump($pi->isConnected); 8 9// ノードをドキュメントに追加する 10$doc->appendChild($pi); 11 12// ノードがドキュメントに追加された後は true 13var_dump($pi->isConnected); 14 15?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
bool
このプロパティは、DOMProcessingInstructionノードがドキュメントツリーに接続されているかどうかを示す真偽値を返します。
サンプルコード
DOMProcessingInstructionの接続状態を確認する
1<?php 2 3/** 4 * DOMProcessingInstruction の接続状態 (isConnected) をデモンストレーションする関数です。 5 * 6 * この関数は、DOMProcessingInstruction オブジェクトが DOM ドキュメントツリーに 7 * 追加される前と後で、isConnected メソッドがどのように動作するかを示します。 8 * isConnected は、ノードがドキュメントに「接続されている」状態にあるかを判定します。 9 */ 10function demonstrateProcessingInstructionConnection(): void 11{ 12 // 1. 新しい DOM ドキュメントを作成します。 13 // これは XML または HTML ドキュメントの全体を表します。 14 $dom = new DOMDocument('1.0', 'UTF-8'); 15 16 // 2. DOMProcessingInstruction オブジェクトを作成します。 17 // これは XML の処理命令 (例: <?php foo="bar"?>) を表します。 18 // ここでは、`<?target data="value"?>` の形式で `<?php version="1.0"?>` のような 19 // 処理命令をシミュレートしています。 20 $processingInstruction = new DOMProcessingInstruction('php', 'version="1.0" encoding="UTF-8"'); 21 22 echo "--- 処理命令がドキュメントに追加される前 ---" . PHP_EOL; 23 // 処理命令が DOM ドキュメントツリーに接続されているか確認します。 24 // この時点ではまだドキュメントに追加されていないため、false を返すはずです。 25 if ($processingInstruction->isConnected()) { 26 echo "処理命令はドキュメントに接続されています。" . PHP_EOL; 27 } else { 28 echo "処理命令はドキュメントに接続されていません。" . PHP_EOL; 29 } 30 31 echo PHP_EOL; 32 33 echo "--- 処理命令をドキュメントに追加 ---" . PHP_EOL; 34 // 処理命令を DOM ドキュメントのルートに追加します。 35 // appendChild() メソッドは、ノードを親ノードの子リストの最後に追加します。 36 $dom->appendChild($processingInstruction); 37 echo "処理命令をドキュメントに追加しました。" . PHP_EOL; 38 39 echo PHP_EOL; 40 41 echo "--- 処理命令がドキュメントに追加された後 ---" . PHP_EOL; 42 // 処理命令が DOM ドキュメントツリーに接続されているか再度確認します。 43 // ドキュメントに追加されたため、true を返すはずです。 44 if ($processingInstruction->isConnected()) { 45 echo "処理命令はドキュメントに接続されています。" . PHP_EOL; 46 } else { 47 echo "処理命令はドキュメントに接続されていません。" . PHP_EOL; 48 } 49 50 echo PHP_EOL; 51 52 echo "--- ドキュメントの最終的な内容 (確認用) ---" . PHP_EOL; 53 // ドキュメントのXML内容を出力して、処理命令が追加されたことを視覚的に確認します。 54 echo $dom->saveXML(); 55} 56 57// 上記の関数を実行して、DOMProcessingInstruction の isConnected メソッドの動作を確認します。 58demonstrateProcessingInstructionConnection(); 59
PHP 8のDOMProcessingInstructionクラスは、XMLやHTMLドキュメント内で特定のアプリケーションに対する指示を記述する「処理命令」(例: <?php version="1.0"?>)を表すオブジェクトです。このクラスが提供するisConnectedメソッドは、現在操作しているDOMProcessingInstructionオブジェクトが、実際にDOMドキュメントツリーに接続されているかどうかを判定します。
isConnectedメソッドは引数を必要とせず、戻り値としてブール型(trueまたはfalse)を返します。オブジェクトがドキュメントツリー(例えば、DOMDocumentオブジェクト)に子ノードとして追加され、その一部となっている場合はtrueを返します。一方、オブジェクトが単に作成されただけで、まだどのドキュメントにも追加されていない独立した状態である場合はfalseを返します。
提示されたサンプルコードでは、DOMProcessingInstructionオブジェクトを新しく作成した直後にisConnected()を呼び出すとfalseが出力されます。これは、まだどのドキュメントにも接続されていないためです。その後、DOMDocumentオブジェクトにappendChild()メソッドを使ってこの処理命令を追加すると、処理命令はドキュメントツリーの一部となります。この状態で再度isConnected()を呼び出すと、今度はtrueが出力され、オブジェクトがドキュメントに接続されたことを示します。このメソッドは、ノードが有効なドキュメントの一部として扱える状態にあるかを確認する際に利用できます。
isConnected()は、作成されたDOMノードが実際にDOMドキュメントツリーに組み込まれているか、つまり「接続されているか」を判定します。ノードオブジェクトを単に生成しただけでは接続されていないためfalseを返し、appendChildなどのメソッドでドキュメントへ追加するとtrueとなります。また、ドキュメントから削除された場合もfalseに戻るため、ノードの接続状態を正確に確認する際に役立ちます。この挙動はDOMProcessingInstructionに限定されず、DOMElementやDOMTextなど、PHPのDOM拡張が提供する他の全てのノードタイプに共通する基本的な特性ですので、他のノード操作にも応用できます。この機能を利用するには、PHPのDOM拡張モジュールが有効になっている必要があります。
DOMProcessingInstruction::isConnectedを理解する
1<?php 2 3/** 4 * DOMProcessingInstruction の isConnected プロパティの使用例。 5 * 6 * このプロパティは、DOMノード(ここでは処理命令)がDOMドキュメントツリーに 7 * 接続されているかどうかを示します。 8 * 9 * 注意: この「接続」はDOMツリー内での状態を指し、 10 * ネットワーク接続の状態(例: Paho MQTTクライアントの接続状態)とは異なります。 11 * 12 * @return void 13 */ 14function demonstrateProcessingInstructionConnection(): void 15{ 16 // 1. 新しいDOMドキュメントを作成します。 17 $dom = new DOMDocument(); 18 19 // 2. 処理命令ノード (Processing Instruction) を作成します。 20 // 例: <?php echo "Hello"; ?> のようなものです。 21 $instruction = $dom->createProcessingInstruction('php', 'echo "Hello world!";'); 22 23 echo "--- ノード作成直後 ---" . PHP_EOL; 24 // 3. ノードはまだDOMドキュメントツリーに追加されていないため、isConnected は false です。 25 echo "処理命令ノードはDOMツリーに接続されていますか? " . ($instruction->isConnected ? "はい" : "いいえ") . PHP_EOL; 26 27 // 4. 作成した処理命令ノードをDOMドキュメントに追加します。 28 $dom->appendChild($instruction); 29 30 echo PHP_EOL . "--- ドキュメントに追加後 ---" . PHP_EOL; 31 // 5. ノードがDOMドキュメントツリーに追加されたため、isConnected は true になります。 32 echo "処理命令ノードはDOMツリーに接続されていますか? " . ($instruction->isConnected ? "はい" : "いいえ") . PHP_EOL; 33 34 // 6. ノードをDOMドキュメントから削除します。 35 $dom->removeChild($instruction); 36 37 echo PHP_EOL . "--- ドキュメントから削除後 ---" . PHP_EOL; 38 // 7. ノードがDOMドキュメントツリーから削除されたため、isConnected は false に戻ります。 39 echo "処理命令ノードはDOMツリーに接続されていますか? " . ($instruction->isConnected ? "はい" : "いいえ") . PHP_EOL; 40} 41 42// サンプル関数を実行します。 43demonstrateProcessingInstructionConnection();
PHP 8のDOMProcessingInstructionクラスが持つisConnectedプロパティは、DOMノードが現在DOMドキュメントツリーに「接続」されているかどうかを示す真偽値(bool)を返します。このプロパティは引数を取りません。
ここでいう「接続」とは、DOMノードがXMLやHTMLドキュメントの構造内に含まれている状態を指し、ネットワーク接続のような外部との接続状態とは異なります。例えば、MQTTクライアントの接続状態("Paho connection lost"のような状況)とは無関係です。
具体的には、DOMProcessingInstructionオブジェクトを新しく作成した直後は、まだどのDOMドキュメントツリーにも追加されていないため、isConnectedはfalseとなります。その後、DOMDocumentのappendChildメソッドなどでドキュメントツリーに追加されると、isConnectedの値はtrueに変わります。さらに、ツリーからremoveChildメソッドなどで削除されると、再びisConnectedはfalseに戻ります。このように、isConnectedプロパティは、DOMノードがドキュメント内のどこかに存在するかを判別する際に役立ちます。
このisConnectedプロパティは、PHPのDOM操作において、特定のノードが現在DOMドキュメントツリーに接続されているか(組み込まれているか)を示す真偽値です。最も重要な注意点として、この「接続」はインターネットや外部システムへのネットワーク接続(例えば、Paho MQTTクライアントの接続状態)とは全く異なりますので、混同しないようにしてください。ノードを作成した直後やDOMツリーから削除された状態ではfalseを返し、DOMDocument::appendChild()などのメソッドでドキュメントツリーに実際に追加された場合にのみtrueとなります。DOMノードのライフサイクルにおける状態を正確に把握し、処理を分岐させる際に利用されます。