Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】readline_completion_function()関数の使い方

readline_completion_function関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

readline_completion_function関数は、PHPのreadline拡張機能において、ユーザーがコマンドラインインターフェース(CLI)で入力中にタブキーを押した際に、自動補完の候補を生成するためのカスタム関数を設定する関数です。

この関数にコールバック関数を登録することで、PHPスクリプトが対話的に動作している際に、標準のファイル名補完とは異なる独自の補完ロジックを実装できるようになります。登録されたコールバック関数は、二つの引数を受け取ります。一つ目は、ユーザーが現在入力している部分文字列(ワード)、二つ目は、タブ補完が行われている位置を示す整数値です。このコールバック関数は、指定された部分文字列に基づいて、補完候補となる文字列の配列を返さなければなりません。

例えば、特定のコマンドの引数や、データベースから取得したデータの名称などを補完候補として提示したい場合に非常に有効です。readline_completion_functionを使用すると、開発者はCLIアプリケーションのユーザーエクスペリエンスを大幅に向上させることができます。一度コールバック関数が設定されると、以前に設定されていた補完関数は上書きされます。この機能を利用するには、PHPが--with-readlineオプションを付けてコンパイルされ、readline拡張機能が有効になっている必要があります。主にコマンドラインで動作するPHPスクリプト向けに設計されています。

構文(syntax)

1<?php
2
3function my_completion_callback(string $input): array
4{
5    $available_options = ['command_a', 'command_b', 'command_c', 'another_command'];
6    return array_filter($available_options, fn($option) => str_starts_with($option, $input));
7}
8
9readline_completion_function('my_completion_callback');

引数(parameters)

callable $callback

  • callable $callback: 行の補完候補を生成するコールバック関数を指定します。この関数は、現在の入力文字列と、生成された補完候補の配列を引数として受け取ります。

戻り値(return)

bool

指定されたコールバック関数が正常に登録された場合は true を、そうでない場合は false を返します。

サンプルコード

PHP readline でコマンド補完する

1<?php
2
3/**
4 * readline_completion_function に登録するコールバック関数。
5 * ユーザーがreadline()関数で入力を求めている最中にTabキーを押すと、この関数が呼び出されます。
6 * 現在入力されている文字列に基づいて、補完候補の配列を返します。
7 *
8 * @param string $input 現在ユーザーが入力している文字列
9 * @return array 補完候補の文字列の配列
10 */
11function myCompletionCallback(string $input): array
12{
13    // 補完の対象となるコマンドやキーワードのリストを定義します。
14    // ここでは、架空のシェルコマンドを例としています。
15    $availableCommands = ['help', 'list', 'show', 'exit', 'quit', 'status', 'config'];
16    $matches = [];
17
18    // 現在の入力文字列 ($input) で始まるコマンドをフィルタリングし、
19    // 補完候補として $matches 配列に追加します。
20    foreach ($availableCommands as $command) {
21        if (str_starts_with($command, $input)) {
22            $matches[] = $command;
23        }
24    }
25
26    return $matches;
27}
28
29// -------------------------------------------------------------------------
30// 以下は、readline_completion_function の動作を確認するためのメインスクリプトです。
31// -------------------------------------------------------------------------
32
33// PHPのreadline拡張機能がロードされているか確認します。
34// この拡張機能がないと、readline()関数やreadline_completion_function()は動作しません。
35if (!extension_loaded('readline')) {
36    echo "エラー: readline 拡張機能がロードされていません。\n";
37    echo "PHP CLI 環境で readline 拡張が有効になっていることを確認してください。\n";
38    echo "通常は php.ini ファイルで 'extension=readline' の行を有効にする必要があります。\n";
39    exit(1); // エラー終了
40}
41
42// myCompletionCallback 関数を補完ハンドラとして登録します。
43// これにより、readline()関数が使われている時にTabキーを押すと、
44// myCompletionCallback 関数が呼び出され、補完候補が表示されるようになります。
45readline_completion_function('myCompletionCallback');
46
47echo "インタラクティブシェルを開始します。\n";
48echo "'help' や 'list' などを入力し、Tabキーを押して補完を試してみてください。\n";
49echo "'exit' または 'quit' と入力してシェルを終了します。\n\n";
50
51// 無限ループでユーザーからの入力を待ち受けます。
52while (true) {
53    // readline() 関数を使って、ユーザーからの入力を受け取ります。
54    // プロンプトとして "php-cli> " が表示されます。
55    // ユーザーが Ctrl+D (EOF) を入力した場合、readline() は false を返します。
56    $line = readline("php-cli> ");
57
58    // ユーザーが Ctrl+D を押してシェルを終了しようとした場合
59    if ($line === false) {
60        echo "EOF が検出されました。シェルを終了します。\n";
61        break;
62    }
63
64    // readline_add_history() を使って、入力されたコマンドを履歴に追加します。
65    // これにより、上下の矢印キーで過去のコマンドを辿れるようになります。
66    readline_add_history($line);
67
68    // 入力されたコマンドの前後の空白を除去し、小文字に変換します。
69    $command = strtolower(trim($line));
70
71    // 終了コマンド ('exit' または 'quit') が入力された場合、ループを終了します。
72    if (in_array($command, ['exit', 'quit'])) {
73        echo "シェルを終了します。\n";
74        break;
75    }
76
77    // 入力されたコマンドに応じた処理の例 (実際にはより複雑な処理が行われます)
78    if ($command === 'help') {
79        echo "利用可能なコマンド: help, list, show, status, config, exit, quit\n";
80    } elseif ($command === 'list') {
81        echo "項目をリストアップしています...\n";
82    } elseif ($command === 'show') {
83        echo "詳細情報を表示しています...\n";
84    } elseif ($command === 'status') {
85        echo "現在のシステムステータス: 稼働中\n";
86    } elseif ($command === 'config') {
87        echo "設定情報を表示します...\n";
88    } elseif ($command === '') {
89        // 空行の場合は何も表示しない
90    } else {
91        // 未知のコマンドの場合
92        echo "エラー: 不明なコマンド '" . $line . "' です。'help' で利用可能なコマンドを確認してください。\n";
93    }
94}
95
96?>

PHPのreadline_completion_functionは、readline()関数を用いてコマンドラインでユーザーからの入力を受け付ける際に、Tabキーによる入力補完機能を追加するための関数です。引数callable $callbackには、補完候補を生成するカスタム関数を指定します。このコールバック関数は、ユーザーが現在入力している文字列を引数として受け取り、それに基づいた補完候補の文字列配列を返さなければなりません。readline_completion_functionは、コールバック関数の登録が成功したかどうかをbool値で返します。

サンプルコードでは、myCompletionCallback関数がこの補完コールバックとして定義されています。この関数は、与えられた入力文字列に合致するコマンドを定義済みリストから探し、補完候補として返します。メインスクリプトでは、readline拡張機能がロードされているか確認した後、readline_completion_functionを使ってmyCompletionCallbackを補完ハンドラとして登録しています。これにより、readline()関数によるインタラクティブな入力中にTabキーを押すと、登録されたmyCompletionCallbackが呼び出され、適切な補完候補が表示されるようになります。このコードは、PHPでユーザーフレンドリーなコマンドラインインターフェース(CLI)アプリケーションを開発する際の入力補完機能の実装方法を示しています。

readline_completion_functionを利用するには、まずPHPのreadline拡張機能を有効にする必要があります。php.iniextension=readlineの設定を確認してください。この関数に登録するコールバック関数は、readline()でユーザーが入力中にTabキーを押した際に自動的に呼び出されます。コールバックは、現在の入力文字列を引数に受け取り、補完候補となる文字列の配列を返すように実装してください。これにより、コマンドの入力を支援します。また、readline_add_history関数を用いると、過去の入力履歴を保存し、上下キーで再利用できるようになり、利便性が高まります。readline()関数がfalseを返した場合、通常はユーザーがCtrl+D(EOF)を入力したことを示すため、適切にプログラムを終了させる処理を行うことが重要です。

PHP readline でタブ補完を実装する

1<?php
2
3// 補完候補のリストを定義します。
4// システムで利用できるコマンドやキーワードのリストを想定しています。
5$availableCommands = ['help', 'list', 'show', 'exit', 'status', 'config', 'useradd', 'userdel'];
6
7/**
8 * PHPのreadline拡張機能で使用されるタブ補完のコールバック関数。
9 *
10 * ユーザーがCLIでコマンドを入力中にTabキーを押すと、この関数が自動的に呼び出されます。
11 * 現在の入力文字列に基づいて、補完候補の配列を返します。
12 *
13 * @param string $input 現在ユーザーが入力している部分文字列
14 * @param int $index カーソルが入力文字列のどこにあるかを示す整数 (この例では未使用)
15 * @return array<string> $input に基づく補完候補の文字列配列
16 */
17function myTabCompletionFunction(string $input, int $index): array
18{
19    // グローバルスコープで定義された利用可能なコマンドリストを参照します。
20    global $availableCommands;
21
22    $suggestions = [];
23    foreach ($availableCommands as $command) {
24        // 現在の入力文字列 ($input) が、利用可能なコマンドの先頭と一致するかをチェックします。
25        // str_starts_with は PHP 8 で導入された便利な関数です。
26        if (str_starts_with($command, $input)) {
27            $suggestions[] = $command;
28        }
29    }
30
31    return $suggestions;
32}
33
34// readline_completion_functionを呼び出し、上で定義したコールバック関数を登録します。
35// これにより、readline()関数で入力を受け取る際にタブ補完が有効になります。
36// 登録が失敗する(例: readline拡張が有効でない)場合はエラーメッセージを表示して終了します。
37if (!readline_completion_function('myTabCompletionFunction')) {
38    echo "エラー: readline補完関数の登録に失敗しました。\n";
39    echo "PHPがreadline拡張モジュールを有効にしてコンパイルされているか確認してください。\n";
40    exit(1);
41}
42
43echo "PHPインタラクティブシェルへようこそ (PHP 8 Readline Extension).\n";
44echo "コマンド ('help', 'list' など) を入力し、TABキーで補完を試してください。\n";
45echo "'exit' と入力するとシェルを終了します。\n";
46
47// 無限ループでユーザーからの入力を受け付けます。
48// これは、CLIアプリケーションでインタラクティブなシェルを模倣する一般的な方法です。
49while (true) {
50    // readline()関数は、指定されたプロンプト (ここでは '>') を表示し、
51    // ユーザーからの入力行を受け取ります。
52    $line = readline('> ');
53
54    // 入力された行が空でない場合、その行をreadlineの履歴に追加します。
55    // これにより、↑/↓キーで過去のコマンドを呼び出すことができます。
56    if ($line !== '') {
57        readline_add_history($line);
58    }
59
60    // ユーザーが 'exit' と入力した場合、ループを終了してシェルを閉じます。
61    if ($line === 'exit') {
62        echo "シェルを終了します。\n";
63        break;
64    }
65
66    // ここで入力されたコマンドに対する実際の処理を記述します。
67    // このサンプルコードでは、入力された内容を単に表示するだけです。
68    echo "あなたが入力したのは: " . $line . "\n";
69}

PHPのreadline_completion_functionは、コマンドラインインターフェース(CLI)アプリケーションにおいて、ユーザーが入力中にTabキーを押した際に、自動的に補完候補を表示するための機能を提供する関数です。readline拡張機能の一部であり、対話型のシェルなどを構築する際に役立ちます。

この関数はcallable $callbackという引数を一つ受け取ります。これは、ユーザーの入力に基づいて補完候補のリストを生成する、カスタムのコールバック関数を指定するためのものです。指定されたコールバック関数は、現在ユーザーが入力している文字列とカーソル位置の2つの引数を受け取ります。そして、その入力文字列に一致する補完候補の文字列配列を返却するように実装します。サンプルコードのmyTabCompletionFunctionがこのコールバック関数の具体例であり、定義済みのコマンドリストから入力に合致する候補を探して返しています。

readline_completion_functionの戻り値はbool型で、コールバック関数の登録が成功したかどうかを示します。trueであれば登録成功、falseであれば失敗です。通常、登録が失敗する原因としては、PHPの実行環境でreadline拡張モジュールが有効になっていないことが考えられます。

サンプルコードでは、まず利用可能なコマンドのリストを準備し、それに基づいて補完候補を返すmyTabCompletionFunctionを定義しています。次に、readline_completion_functionにこの関数を登録することで、readline()関数でユーザーからの入力を受け付ける際にTab補完機能が有効になります。これにより、ユーザーは部分的な文字列を入力してTabキーを押すだけで、登録されたコールバック関数によって生成された適切な候補を効率的に選択できるようになります。

PHPのreadline_completion_functionは、CLI環境でユーザー入力のタブ補完を可能にする機能です。この機能を利用するには、まずPHPがreadline拡張モジュールを有効にしてコンパイルされている必要があります。有効でない場合、関数登録が失敗しますのでご注意ください。サンプルコードの補完コールバック関数は、ユーザーの入力文字列を受け取り、それに応じた候補の文字列配列を返す必要があります。関数内でglobalキーワードを使って外部変数を参照している点や、クロージャを使用する選択肢があることも理解しておくと良いでしょう。また、readline()関数は対話的な入力に特化しており、ウェブ環境では使用できません。PHP 8の新機能であるstr_starts_with関数も利用されているため、PHP 8以降の環境で実行する必要があります。

関連コンテンツ

関連IT用語