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

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

作成日: 更新日:

基本的な使い方

targetプロパティは、処理命令(Processing Instruction)のターゲットを保持するプロパティです。処理命令とは、XMLやHTML文書内で、特定のアプリケーションに対する指示を記述するためのもので、<??> で囲まれた形式で表現されます。この処理命令の最初の部分、つまり <? の直後に続く単語が「ターゲット」であり、その命令がどのアプリケーションに向けられたものかを示します。例えば、<?xml-stylesheet type="text/css" href="style.css"?> という処理命令があった場合、targetプロパティは文字列 "xml-stylesheet" を保持します。このプロパティは読み取り専用であり、Dom\ProcessingInstructionオブジェクトが生成された後にその値を変更することはできません。値はオブジェクトの生成時に決定されます。このプロパティを参照することで、文書内に存在する様々な処理命令の中から、目的のアプリケーションに対する指示だけを効率的に探し出し、適切に処理を実行させることが可能になります。

構文(syntax)

1<?php
2$xmlString = '<?xml version="1.0" encoding="UTF-8"?>
3<?xml-stylesheet type="text/css" href="style.css"?>
4<root></root>';
5
6$document = new DOMDocument();
7$document->loadXML($xmlString);
8
9/** @var DOMProcessingInstruction $instruction */
10$instruction = $document->childNodes[1];
11
12// ProcessingInstruction のターゲット (例: "xml-stylesheet") を取得します。
13$targetName = $instruction->target;
14
15echo $targetName;
16?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

string

Dom\ProcessingInstructionクラスのtargetプロパティは、処理命令のターゲット名を文字列として返します。

サンプルコード

PHP Dom Processing Instruction Target 取得

1<?php
2
3/**
4 * XMLドキュメント内の処理命令(Processing Instruction)のターゲットを取得するデモ。
5 *
6 * Dom\ProcessingInstruction クラスの 'target' プロパティの使用例を示します。
7 * 'target' は、処理命令のターゲット名(例: `<?target data?>` の 'target' の部分)を返します。
8 */
9function demonstrateProcessingInstructionTarget(): void
10{
11    // キーワード "php target group s.r.l" に関連付けたXML文字列を定義します。
12    // ターゲットが 'php-target-group'、データが 's.r.l="company"' の処理命令を含みます。
13    $xmlString = <<<XML
14    <?xml version="1.0" encoding="UTF-8"?>
15    <?php-target-group s.r.l="company"?>
16    <root>
17        <element>Some content</element>
18    </root>
19    XML;
20
21    // Dom\Document オブジェクトをインスタンス化します
22    $doc = new \Dom\Document();
23
24    // XML文字列を読み込み、パースします
25    $doc->loadXML($xmlString);
26
27    // ドキュメントの直下の子ノードを順番に確認します
28    foreach ($doc->childNodes as $node) {
29        // ノードが Dom\ProcessingInstruction のインスタンスであるかを確認します
30        if ($node instanceof \Dom\ProcessingInstruction) {
31            // target プロパティにアクセスして、処理命令のターゲット名を取得・表示します
32            echo "Found Processing Instruction." . PHP_EOL;
33            echo "Target: " . $node->target . PHP_EOL; // "php-target-group" が出力されます
34            echo "Data: " . $node->data . PHP_EOL;     // "s.r.l="company"" が出力されます
35            break; // 最初の処理命令を見つけたらループを終了します
36        }
37    }
38}
39
40// 関数を実行します
41demonstrateProcessingInstructionTarget();

このPHPサンプルコードは、XML文書内に含まれる「処理命令(Processing Instruction)」のターゲット名を取得する方法を解説するものです。処理命令とは、XML文書の<??>で囲まれた部分のことで、XMLを処理する特定のアプリケーションに対する指示を記述するために使用されます。

このコードでは、Dom\ProcessingInstructionクラスのtargetプロパティを利用します。このプロパティは、処理命令のターゲット部分(例: <?target data?>targetの部分)を文字列として取得するためのものです。プロパティへのアクセスに引数は不要で、戻り値としてターゲット名を表す文字列が返されます。

サンプルコードの処理の流れとしては、まず<?php-target-group s.r.l="company"?>という処理命令を含むXMLデータをDom\Documentオブジェクトとして読み込みます。次に、XML文書内の各ノードを調べ、それが処理命令であるかを判定します。処理命令が見つかると、$node->targetのようにtargetプロパティにアクセスし、ターゲット名であるphp-target-groupを取得して画面に出力します。これにより、XML内の特定の命令を識別し、それに応じた処理を実行できます。

このコードは、XML処理命令のターゲット名を取得します。targetプロパティは <?target data?> という形式の target 部分の文字列を返します。これは、ターゲット名以降の全ての文字列を返す data プロパティとは異なるため注意が必要です。XML文書には様々な種類のノードが含まれるため、instanceof を使ってノードが Dom\ProcessingInstruction であることを必ず確認してからプロパティにアクセスしてください。この確認を怠ると、対象外のノードでエラーが発生する原因となります。また、サンプルコードで利用している \Dom\ 名前空間のクラス群はPHP 8.0以降で利用可能です。

PHPでXMLのtarget-price処理命令を取得する

1<?php
2
3declare(strict_types=1);
4
5/**
6 * XML文字列から 'target-price' というターゲットを持つ処理命令(Processing Instruction)を探し、
7 * その情報を表示します。
8 *
9 * Dom\ProcessingInstructionクラスの `target` プロパティを使用して、
10 * 処理命令のターゲット名(例: `<?target-price ...?>` の `target-price` 部分)を取得します。
11 *
12 * @param string $xmlContent 解析対象のXML文字列。
13 */
14function findTargetPriceInstruction(string $xmlContent): void
15{
16    // DOMDocumentオブジェクトを初期化
17    $dom = new \DOMDocument();
18
19    // XML文字列を安全に読み込む
20    if (!$dom->loadXML($xmlContent)) {
21        echo "XMLの解析に失敗しました。";
22        return;
23    }
24
25    // ドキュメントのルート直下にあるノードを走査
26    foreach ($dom->childNodes as $node) {
27        // ノードが処理命令(ProcessingInstruction)であるかを確認
28        if ($node instanceof \Dom\ProcessingInstruction) {
29            // `target` プロパティをチェックして、目的の処理命令か判断
30            if ($node->target === 'target-price') {
31                echo "処理命令ターゲット: " . htmlspecialchars($node->target) . PHP_EOL;
32                echo "目標価格データ: " . htmlspecialchars($node->data) . PHP_EOL;
33            }
34        }
35    }
36}
37
38// サンプルXMLデータ。商品情報の中に目標価格を示す処理命令を含んでいる。
39$productXml = <<<XML
40<?xml version="1.0" encoding="UTF-8"?>
41<product>
42    <id>P-001</id>
43    <name>Professional PHP Development Tool</name>
44    <?target-price currency="JPY" value="15000"?>
45    <price>18000</price>
46</product>
47XML;
48
49// 関数を実行して結果を表示
50findTargetPriceInstruction($productXml);
51
52?>

PHPのDom\ProcessingInstructionクラスは、XML文書内に記述される「処理命令(Processing Instruction)」をオブジェクトとして扱うためのものです。処理命令とは、<?...?>という形式で記述され、特定のアプリケーションに指示を伝える役割があります。

このサンプルコードは、商品情報を表すXMLデータの中から、targetプロパティを利用して「目標価格(target-price)」に関する処理命令を探し出し、その情報を表示する例です。

targetプロパティは、Dom\ProcessingInstructionオブジェクトが持つプロパティで、処理命令の名前部分(ターゲット)を取得するために使用します。このプロパティは引数を取らず、戻り値としてターゲット名が文字列(string)で返されます。例えば<?target-price ...?>という処理命令の場合、targetプロパティの値は文字列'target-price'となります。

コードの流れとしては、まずXML文字列をDOMDocumentオブジェクトに読み込みます。次に、文書内の全ノードを一つずつループで確認し、ノードが処理命令であるかをinstanceofで判定します。処理命令であった場合、$node->target === 'target-price'という条件式でターゲット名が目的のものと一致するかを調べ、一致すればその内容を出力します。このようにtargetプロパティは、特定の処理命令を識別する上で重要な役割を果たします。

このコードはPHP 8の新しいDOM拡張機能を利用しています。XMLには要素の他にテキストやコメントなど多様なノードが含まれるため、instanceof を用いてノードの種類を正確に判定することが重要です。targetプロパティは、処理命令 <?...?> の中で、<? の直後にある名前の部分を取得します。その後の残りのデータはすべて dataプロパティに一つの文字列として格納されるため、個別の値(例:value="15000")を取り出すには追加の文字列解析が必要です。安全なプログラムのため、loadXMLが失敗した場合の処理を記述し、出力の際はhtmlspecialcharsでエスケープする習慣をつけましょう。

関連コンテンツ