【PHP8.x】getLinkTargetメソッドの使い方

getLinkTargetメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

getLinkTargetメソッドは、PHPのFilesystemIteratorクラスに属し、ファイルシステム上のシンボリックリンクのターゲットパスを取得するメソッドです。FilesystemIteratorは、ファイルやディレクトリを効率的に反復処理するためのクラスであり、このメソッドはその反復処理中に現在の要素がシンボリックリンクであった場合に真価を発揮します。

シンボリックリンクとは、ファイルシステム上の別のファイルやディレクトリを指し示す特殊な参照ファイルであり、WindowsにおけるショートカットやmacOSにおけるエイリアスと概念的に似ています。getLinkTargetメソッドは、イテレータが現在指している要素がこのシンボリックリンクである場合、そのリンクが実際に指しているファイルまたはディレクトリの絶対パスを文字列として返します。

もし現在の要素がシンボリックリンクではない場合、またはシンボリックリンクのターゲットが存在しない場合は、このメソッドはfalseを返します。したがって、このメソッドの戻り値を利用する際には、それがfalseでないことを確認してから処理を進める必要があります。

この機能は、ファイルシステムの構造を解析するツールや、バックアップスクリプトなどで、シンボリックリンクがどこを指しているのかを正確に把握したい場合に非常に役立ちます。例えば、特定のディレクトリをスキャンして、含まれるシンボリックリンクとその実体をリストアップするような用途に活用できます。

構文(syntax)

1<?php
2
3// 一時ディレクトリとシンボリックリンクを作成
4$tempDir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'php_fs_iterator_test_' . uniqid();
5mkdir($tempDir);
6$targetFilePath = $tempDir . DIRECTORY_SEPARATOR . 'original.txt';
7file_put_contents($targetFilePath, 'This is the original file content.');
8$symlinkPath = $tempDir . DIRECTORY_SEPARATOR . 'link_to_original.txt';
9symlink($targetFilePath, $symlinkPath);
10
11try {
12    // FilesystemIterator をインスタンス化
13    // FilesystemIterator::SKIP_DOTS は '.' と '..' をスキップします
14    // FilesystemIterator::CURRENT_AS_FILEINFO は各要素を SplFileInfo オブジェクトとして返します
15    $iterator = new FilesystemIterator($tempDir, FilesystemIterator::SKIP_DOTS | FilesystemIterator::CURRENT_AS_FILEINFO);
16
17    foreach ($iterator as $fileInfo) {
18        if ($fileInfo->isLink()) {
19            // FilesystemIterator::getLinkTarget() の構文例
20            // シンボリックリンクの場合、そのターゲットパスを返します。
21            // 失敗した場合は false を返します。
22            $linkTarget = $fileInfo->getLinkTarget();
23
24            if ($linkTarget !== false) {
25                echo "ファイル: " . $fileInfo->getFilename() . " はシンボリックリンクです。リンク先: " . $linkTarget . "\n";
26            } else {
27                echo "ファイル: " . $fileInfo->getFilename() . " はシンボリックリンクですが、ターゲットの取得に失敗しました。\n";
28            }
29        } else {
30            echo "ファイル: " . $fileInfo->getFilename() . " はシンボリックリンクではありません。\n";
31        }
32    }
33} finally {
34    // 後処理として作成したファイルとディレクトリを削除
35    if (file_exists($symlinkPath)) {
36        unlink($symlinkPath);
37    }
38    if (file_exists($targetFilePath)) {
39        unlink($targetFilePath);
40    }
41    if (file_exists($tempDir)) {
42        rmdir($tempDir);
43    }
44}
45
46?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

string|false

シンボリックリンクの実際のターゲットパスを文字列として返します。リンクでない場合は false を返します。

【PHP8.x】getLinkTargetメソッドの使い方 | いっしー@Webエンジニア