【PHP8.x】standaloneプロパティの使い方

standaloneプロパティの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

standaloneプロパティは、XML宣言におけるstandalone属性の値を保持するプロパティです。この属性は、XMLドキュメントが外部のDTD(文書型定義)のようなファイルに依存せず、それ自体で完結しているかどうかを示します。このプロパティにtrueを設定すると、saveXML()などのメソッドで出力されるXML宣言はstandalone="yes"となり、ドキュメントが外部に依存しないことを明示します。一方、falseを設定した場合、または何も設定しない場合のデフォルト値はfalseとなり、XML宣言にはstandalone="no"が出力されます。これは、ドキュメントが外部の定義を参照している可能性があることを示します。このプロパティは、ドキュメントのバージョン情報がversionプロパティによって設定されている場合にのみ有効です。バージョンが設定されておらず、XML宣言自体が出力されない場合には、このstandaloneプロパティの値も反映されません。

構文(syntax)

1<?php
2
3// DOMDocumentオブジェクトを生成します。
4$dom = new DOMDocument('1.0', 'UTF-8');
5
6// XML宣言が standalone="yes" を含むように、プロパティに true を設定します。
7$dom->standalone = true;
8
9// プロパティから値を取得することもできます。
10$isStandalone = $dom->standalone; // $isStandalone は bool(true) となります。
11
12// XMLの構造を作成します。
13$root = $dom->createElement('users');
14$dom->appendChild($root);
15
16// 出力を見やすく整形します。
17$dom->formatOutput = true;
18
19// 生成されたXMLを出力します。
20echo $dom->saveXML();
21
22?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

bool|null

このプロパティは、DOMDocument が XML宣言で standalone 属性を宣言しているかどうかを示します。XML宣言で standalone="yes" または standalone="no" と宣言されている場合は true、宣言されていない場合は null を返します。

サンプルコード

PHP DOMDocument standaloneプロパティを調べる

1<?php
2
3/**
4 * 指定されたXML文字列のDOMDocument::$standaloneプロパティの値をチェックし、結果を表示します。
5 *
6 * DOMDocument::$standalone プロパティは、XML宣言の "standalone" 属性に対応します。
7 * このプロパティは、XML文書が外部のDTD(文書型定義)などに依存せず、自己完結しているかを示します。
8 *
9 * - true:  XML宣言に 'standalone="yes"' が指定されている場合。
10 *          このXMLは外部DTDに依存しません。
11 * - false: XML宣言に 'standalone="no"' が指定されている場合。
12 *          このXMLは外部DTDに依存します。
13 * - null:  XML宣言に 'standalone' 属性が指定されていない場合。
14 *          この場合、XMLパーサーはデフォルトの動作(通常は外部DTDを参照する可能性あり)をとります。
15 *
16 * @param string $xmlString チェックするXML文字列。
17 */
18function checkXmlStandaloneProperty(string $xmlString): void
19{
20    echo "--- XML文字列のチェック ---" . PHP_EOL;
21    echo "対象XML: " . str_replace(["\n", "\r"], "", substr($xmlString, 0, 80)) . "..." . PHP_EOL;
22
23    $dom = new DOMDocument();
24    // XML読み込み時の警告を抑制し、内部でエラーを捕捉します。
25    // 実際のアプリケーションでは、エラーログへの記録など適切なエラーハンドリングを推奨します。
26    libxml_use_internal_errors(true);
27    $isLoaded = $dom->loadXML($xmlString);
28    libxml_clear_errors(); // 内部エラーバッファをクリアします。
29
30    if (!$isLoaded) {
31        echo "結果: XMLの読み込みに失敗しました。無効なXMLである可能性があります。" . PHP_EOL;
32        echo "--------------------------" . PHP_EOL . PHP_EOL;
33        return;
34    }
35
36    $standalone = $dom->standalone;
37
38    echo "結果: DOMDocument::\$standalone の値は ";
39    if ($standalone === true) {
40        echo "true です (XMLは 'standalone=\"yes\"' と宣言されています)。" . PHP_EOL;
41    } elseif ($standalone === false) {
42        echo "false です (XMLは 'standalone=\"no\"' と宣言されています)。" . PHP_EOL;
43    } elseif ($standalone === null) {
44        echo "null です (XML宣言に 'standalone' 属性が指定されていません)。" . PHP_EOL;
45    } else {
46        // 通常は発生しないケースですが、型の網羅性のため記述します。
47        echo "不明な値 (" . var_export($standalone, true) . ") です。" . PHP_EOL;
48    }
49    echo "--------------------------" . PHP_EOL . PHP_EOL;
50}
51
52// --- サンプルコードの実行 ---
53
54// ケース1: XML宣言で standalone="yes" が明示されている場合
55$xml1 = '<?xml version="1.0" standalone="yes"?>
56<config><setting name="mode">production</setting></config>';
57checkXmlStandaloneProperty($xml1);
58
59// ケース2: XML宣言で standalone="no" が明示されている場合
60$xml2 = '<?xml version="1.0" standalone="no"?>
61<config><setting name="mode">development</setting></config>';
62checkXmlStandaloneProperty($xml2);
63
64// ケース3: XML宣言に standalone 属性が指定されていない場合
65$xml3 = '<?xml version="1.0"?>
66<config><setting name="logging">verbose</setting></config>';
67checkXmlStandaloneProperty($xml3);
68
69// ケース4: XML宣言自体が存在しない場合 (DOMDocumentが内部的にXML宣言を追加し、standaloneはnullとなることが多い)
70$xml4 = '<config><setting name="cache">enabled</setting></config>';
71checkXmlStandaloneProperty($xml4);
72
73// ケース5: 無効なXML文字列を与えた場合(エラーハンドリングの確認)
74$invalidXml = '<?xml version="1.0"?><config><setting>Invalid XML</config>';
75checkXmlStandaloneProperty($invalidXml);
76

PHPのDOMDocumentクラスが提供するstandaloneプロパティは、XML文書が外部の定義に依存せず、自己完結しているかどうかを示すブール値(真偽値)またはnullを返します。このプロパティは、XML宣言のstandalone属性に対応しています。

具体的には、XML宣言でstandalone="yes"が指定されている場合はtrueを返し、XMLが外部のDTD(文書型定義)などに依存しないことを意味します。一方、standalone="no"と指定されている場合はfalseを返し、XMLが外部のDTDに依存することを示します。もしXML宣言にstandalone属性自体が指定されていない場合はnullを返し、この場合XMLパーサーはデフォルトの動作となります。

このサンプルコードでは、さまざまな形式のXML文字列をDOMDocumentオブジェクトに読み込み、それぞれのXMLにおけるstandaloneプロパティの値がどのように変化するかを示しています。truefalsenullの各ケースを具体的なXML文字列で確認できるため、このプロパティの挙動を初心者の方にも視覚的に理解しやすいように作成されています。XMLの読み込みに失敗した場合のエラーハンドリングも含まれており、実用的な側面も学べます。

DOMDocument::$standaloneプロパティは、XMLが外部の文書型定義(DTDなど)に依存せず自己完結しているかを示します。truefalsenullそれぞれの意味を正確に把握することが大切です。特にnullは、XML宣言にstandalone属性がない状態を指します。サンプルコードのように、libxml_use_internal_errors()でXML読み込み時のエラーを適切に処理することは重要です。本番環境では、単にエラーを抑制するだけでなく、ログ記録など、より詳細なエラーハンドリングを必ず実施してください。無効なXMLを扱う際には、常に読み込みの成否を確認し、堅牢な処理を心がけましょう。

PHP DOMDocument::standalone プロパティを理解する

1<?php
2
3/**
4 * DOMDocument::standalone プロパティの動作を示すサンプルコード。
5 *
6 * このプロパティはXML宣言の `standalone` 属性(例: `<?xml ... standalone="yes"?>`)を扱います。
7 * XMLドキュメントが外部のDTD(文書型定義)に依存せず、自己完結しているかを示します。
8 * 値は `true` (yes), `false` (no), または `null` (属性が存在しない場合) となります。
9 * PHPアプリケーションの実行環境(サーバー)の「スタンドアロン」とは異なる概念です。
10 */
11function demonstrateDomDocumentStandaloneProperty(): void
12{
13    // ----------------------------------------------------
14    // XMLをロードして standalone属性の値を読み込む例
15    // ----------------------------------------------------
16
17    echo "--- XML宣言に 'standalone=\"yes\"' が含まれる場合 ---\n";
18    $xmlYes = new DOMDocument();
19    // XML宣言に standalone="yes" を含むXMLをロード
20    $xmlYes->loadXML('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><root/>');
21    echo "ロードしたXML:\n" . $xmlYes->saveXML() . "\n";
22    // standaloneプロパティは bool|null を返す
23    echo "DOMDocument->standalone: " . var_export($xmlYes->standalone, true) . "\n\n"; // 期待値: true
24
25    echo "--- XML宣言に 'standalone=\"no\"' が含まれる場合 ---\n";
26    $xmlNo = new DOMDocument();
27    // XML宣言に standalone="no" を含むXMLをロード
28    $xmlNo->loadXML('<?xml version="1.0" encoding="UTF-8" standalone="no"?><root/>');
29    echo "ロードしたXML:\n" . $xmlNo->saveXML() . "\n";
30    echo "DOMDocument->standalone: " . var_export($xmlNo->standalone, true) . "\n\n"; // 期待値: false
31
32    echo "--- XML宣言に standalone属性が含まれない場合 ---\n";
33    $xmlNoAttr = new DOMDocument();
34    // standalone属性を含まないXMLをロード
35    $xmlNoAttr->loadXML('<?xml version="1.0" encoding="UTF-8"?><root/>');
36    echo "ロードしたXML:\n" . $xmlNoAttr->saveXML() . "\n";
37    echo "DOMDocument->standalone: " . var_export($xmlNoAttr->standalone, true) . "\n\n"; // 期待値: null
38
39    // ----------------------------------------------------
40    // standaloneプロパティを設定する例
41    // ----------------------------------------------------
42
43    echo "--- standaloneプロパティを設定する ---\n";
44    // 新しいDOMDocumentを作成。XML宣言は自動で追加されない場合がある。
45    $doc = new DOMDocument('1.0', 'UTF-8');
46    $doc->formatOutput = true; // 出力されるXMLを見やすく整形するため
47
48    // ルート要素を追加し、XML宣言を生成させる(standalone属性はまだない)
49    $root = $doc->createElement('root');
50    $doc->appendChild($root);
51    echo "初期XML (standalone属性なし):\n" . $doc->saveXML() . "\n";
52    echo "DOMDocument->standalone: " . var_export($doc->standalone, true) . "\n\n"; // 期待値: null
53
54    // standaloneを true に設定
55    $doc->standalone = true;
56    echo "standalone を true に設定後:\n" . $doc->saveXML() . "\n";
57    echo "DOMDocument->standalone: " . var_export($doc->standalone, true) . "\n\n"; // 期待値: true
58
59    // standaloneを false に設定
60    $doc->standalone = false;
61    echo "standalone を false に設定後:\n" . $doc->saveXML() . "\n";
62    echo "DOMDocument->standalone: " . var_export($doc->standalone, true) . "\n\n"; // 期待値: false
63
64    // standaloneを null に設定 (standalone属性が削除される)
65    $doc->standalone = null;
66    echo "standalone を null に設定後 (属性が削除される):\n" . $doc->saveXML() . "\n";
67    echo "DOMDocument->standalone: " . var_export($doc->standalone, true) . "\n\n"; // 期待値: null
68}
69
70// 上記関数を実行して動作を確認
71demonstrateDomDocumentStandaloneProperty();
72

PHP 8のDOMDocument::standaloneプロパティは、XMLドキュメントのXML宣言に含まれるstandalone属性(例: <?xml ... standalone="yes"?>)を操作するためのものです。このプロパティは、XMLドキュメントが外部のDTD(文書型定義)に依存せず、そのドキュメント自体で完結しているかどうかを示します。PHPアプリケーションの実行環境であるサーバーの「スタンドアロン」という言葉とは異なる概念ですのでご注意ください。

このプロパティは引数を持ちません。XMLドキュメントを読み込んだ際、standalone属性の値が"yes"であればtrueを、"no"であればfalseを戻り値として返します。もしstandalone属性がXML宣言に存在しない場合はnullを返します。

また、このプロパティにtruefalse、またはnullを設定することで、XMLドキュメントのXML宣言におけるstandalone属性を動的に変更できます。trueを設定するとstandalone="yes"が、falseを設定するとstandalone="no"が追加または変更されます。nullを設定すると、standalone属性はXML宣言から削除されます。これにより、XMLの自己完結性に関する情報をプログラムから管理することが可能になります。

DOMDocument::standaloneプロパティは、XML宣言のstandalone属性を操作します。これはXMLドキュメントが外部のDTDに依存せず自己完結しているかを示すものであり、PHPアプリケーションが動作する「スタンドアロンサーバー」とは全く異なる概念です。この点を混同しないように特に注意してください。

プロパティを読み込むと、XML宣言の属性値に応じてtruefalse、または属性が存在しない場合はnullが返されます。また、プロパティにtrueまたはfalseを設定するとXML宣言にstandalone属性が追加・更新され、nullを設定すると属性が削除されます。XMLの生成や解析において、ドキュメントの自己完結性を明確にする必要がある場合に利用するプロパティです。

関連コンテンツ

関連プログラミング言語

【PHP8.x】standaloneプロパティの使い方 | いっしー@Webエンジニア