【PHP8.x】strlen関数の使い方

作成日: 更新日:

strlen関数は、指定された文字列のバイト単位の長さを取得する関数です。

この関数は、引数として一つの文字列を受け取ります。例えば、strlen("Hello")のように記述し、"Hello"という文字列の長さを計算します。戻り値は、その文字列に含まれるバイト数を表す整数値です。ここで重要なのは、strlen関数が「文字数」ではなく「バイト数」を返す点です。

たとえば、半角英数字のみで構成される文字列であれば、一文字が一バイトとして扱われるため、バイト数と文字数は一致します。しかし、「こんにちは」のような日本語の文字列は、UTF-8エンコーディングの場合、一文字が通常三バイトとして扱われるため、strlen("こんにちは")15を返します。これは「こ」が3バイト、「ん」が3バイト、「に」が3バイト、「ち」が3バイト、「は」が3バイトの合計15バイトであるためです。

PHP 8以降のバージョンでは、文字列以外の型の値を引数として渡した場合、TypeErrorというエラーが発生しますので、引数の型には注意が必要です。もし、マルチバイト文字を正確な「文字数」として数えたい場合は、mb_strlen関数を使用する必要があります。

strlen関数は、フォームからの入力値の長さ制限チェックや、データ格納時のバッファサイズ計算など、文字列を扱う様々な場面で利用される基本的な関数です。正確なバイト長を把握することは、システムの安定性やセキュリティを確保する上で非常に重要です。

基本的な使い方

構文(syntax)

<?php
$string_variable = "Hello, PHP!";
$length = strlen($string_variable);
?>

引数(parameters)

string $string

  • string $string: 文字列の長さを測定する対象となる文字列

戻り値(return)

int

strlen関数は、指定された文字列のバイト長を整数値で返します。

サンプルコード

strlen()mb_strlen()の違いを比較する

<?php

/**
 * strlen()とmb_strlen()の違いを比較して表示します。
 *
 * strlen()は文字列のバイト数を返します。
 * mb_strlen()は文字列の文字数を返します。
 * この違いは、日本語のようなマルチバイト文字を扱う際に重要になります。
 */
function compare_string_length_functions(): void
{
    // 比較用の文字列を定義
    $singleByteString = 'hello';       // 半角英字 (1文字 = 1バイト)
    $multiByteString = 'こんにちは'; // 全角日本語 (UTF-8では通常1文字 = 3バイト)

    echo "--- 文字列 '{$singleByteString}' の長さ ---" . PHP_EOL;

    // strlen() はバイト数を返す -> 5
    echo 'strlen: ' . strlen($singleByteString) . ' (バイト数)' . PHP_EOL;

    // mb_strlen() は文字数を返す -> 5
    echo 'mb_strlen: ' . mb_strlen($singleByteString) . ' (文字数)' . PHP_EOL;

    echo PHP_EOL;

    echo "--- 文字列 '{$multiByteString}' の長さ ---" . PHP_EOL;

    // strlen() はバイト数を返す -> 15 (5文字 * 3バイト)
    // 日本語の文字数を数える目的では、意図しない結果になる
    echo 'strlen: ' . strlen($multiByteString) . ' (バイト数)' . PHP_EOL;

    // mb_strlen() は文字数を正しく返す -> 5
    // 日本語などマルチバイト文字の文字数を数える場合はこちらを使用する
    echo 'mb_strlen: ' . mb_strlen($multiByteString) . ' (文字数)' . PHP_EOL;
}

// 関数を実行して結果を表示
compare_string_length_functions();

PHPのstrlen関数は、引数に指定された文字列の長さを整数値で返します。ここで重要なのは、strlenが返す「長さ」とは、見た目の「文字数」ではなく「バイト数」であるという点です。

サンプルコードでは、strlenmb_strlenという2つの関数の違いを示しています。'hello'のような半角英数字(シングルバイト文字)の場合、1文字が1バイトであるため、strlenmb_strlenはどちらも同じ結果「5」を返します。

しかし、'こんにちは'のような日本語(マルチバイト文字)を扱う場合に違いが現れます。UTF-8エンコーディングでは、日本語の1文字は通常3バイトで構成されるため、strlenは5文字×3バイトで「15」というバイト数を返します。これは、プログラマが意図する「5文字」という結果とは異なります。一方で、mb_strlen関数は文字のエンコーディングを考慮して文字数を正しくカウントするため、期待通り「5」を返します。

このように、日本語などのマルチバイト文字を含む文字列の文字数を正確に知りたい場合は、strlenではなくmb_strlen関数を使用する必要があります。

strlen()関数は文字列の長さを取得しますが、注意すべきは、返される値が「文字数」ではなく「バイト数」である点です。半角英数字のように1文字1バイトで表現される文字では問題になりませんが、日本語などのマルチバイト文字を扱う際に、意図しない大きな値が返ってきます。例えば、UTF-8環境でstrlen('あ')を実行すると、文字数の1ではなくバイト数の3が返ります。ユーザー入力の文字数制限など、文字数を正確に数える必要がある場合は、必ずマルチバイト文字に対応したmb_strlen()関数を使用してください。なお、mb_strlen()関数の利用には、PHPのmbstring拡張機能が有効になっている必要があります。

PHP strlen(null)でTypeErrorが発生する現象

<?php

declare(strict_types=1);

/**
 * strlen() 関数に null を渡した場合の挙動を検証します。
 *
 * PHP 8.0 以降、strlen() のような内部関数の型チェックが厳格になりました。
 * string 型を期待する引数に null を渡すと、TypeError がスローされます。
 * このコードは、その挙動を try-catch ブロックを用いて示します。
 */
function checkStrlenWithNull(): void
{
    $value = null;

    try {
        // null を strlen() に渡すと TypeError が発生します。
        // そのため、この行が実行されることはありません。
        $length = strlen($value);
        echo 'null の文字列長: ' . $length . PHP_EOL;
    } catch (TypeError $e) {
        // 発生した TypeError を捕捉し、エラーメッセージを表示します。
        echo 'strlen(null) を実行したところ、エラーが発生しました。' . PHP_EOL;
        echo 'エラーメッセージ: ' . $e->getMessage() . PHP_EOL;
        echo PHP_EOL;
        echo '補足: PHP 7以前では、strlen(null) は 0 を返しましたが、' . PHP_EOL;
        echo '      PHP 8以降では、このように型エラーとして扱われます。' . PHP_EOL;
    }

    echo PHP_EOL;

    // 比較のため、空文字列の場合の挙動を示します。
    $emptyString = '';
    $lengthOfEmpty = strlen($emptyString);
    echo '参考: 空文字列 "" の長さは ' . $lengthOfEmpty . ' です。' . PHP_EOL;
}

// 関数を実行して結果を確認します。
checkStrlenWithNull();

strlen()関数は、引数として渡された文字列の長さをバイト単位で数え、その結果を整数で返すPHPの組み込み関数です。

このサンプルコードは、strlen()関数にnullを渡した場合の挙動を解説しています。PHP 8.0以降、関数の型チェックがより厳格になりました。そのため、strlen()のように文字列を期待する引数にnullを渡すと、TypeErrorというエラーが発生し、プログラムが停止します。

コードでは、エラーによるプログラムの停止を防ぐため、try-catch構文を使用しています。tryブロック内でstrlen(null)を実行しようとするとTypeErrorが発生するため、処理はcatchブロックに移ります。そこで、エラーが発生した旨のメッセージが表示される仕組みです。

補足として、PHP 7以前のバージョンではstrlen(null)はエラーにならず、0を返していました。この挙動の違いは、古いPHPからバージョンアップする際に注意が必要な点です。コードの最後では、比較のために空文字列''の長さを調べており、こちらは期待通り0が返されることを示しています。

PHP 8以降、strlen()関数は引数に文字列型を厳密に要求します。そのため、サンプルコードのようにnullを渡すとTypeErrorというエラーが発生し、プログラムが停止します。初心者が特に注意すべき点は、null(値が存在しない状態)と空文字列""(長さ0の文字列という値)を区別することです。データベースの戻り値など、変数がnullになる可能性がある場合は、strlen()に渡す前に、is_string()関数で変数が文字列かを確認したり、??演算子を使って $variable ?? '' のようにnullの場合に空文字列へ変換したりすることで、意図しないエラーを防げます。PHP 7以前はstrlen(null)が0を返していたため、古い情報やコードを参考にする際は特に注意が必要です。

PHP strlen関数で全角文字をバイト数で数える

<?php

/**
 * PHPのstrlen関数が文字列のバイト数を返すことを示すサンプルコード。
 *
 * strlen関数は、マルチバイト文字(例: 日本語の全角文字)を扱う際に、
 * 見た目の文字数ではなく、その文字が占めるバイト数でカウントします。
 * UTF-8エンコーディングの場合、日本語の全角文字は通常1文字あたり3バイトとして扱われます。
 */
function demonstrateStrlenWithMultibyteCharacters(): void
{
    // 半角文字のみの文字列
    $asciiString = "Hello";
    // strlenは半角文字1文字を1バイトとして数える
    echo "文字列: '{$asciiString}'\n";
    echo "strlenの結果 (バイト数): " . strlen($asciiString) . " バイト\n"; // 出力: 5

    echo "\n";

    // 全角文字を含む文字列 (UTF-8エンコーディングを想定)
    $multibyteString = "こんにちは"; // 5文字
    // UTF-8エンコーディングでは、日本語の全角文字は通常1文字あたり3バイトです。
    // そのため、「こんにちは」5文字は、5 * 3 = 15バイトとしてカウントされます。
    echo "文字列: '{$multibyteString}'\n";
    echo "strlenの結果 (バイト数): " . strlen($multibyteString) . " バイト\n"; // 出力: 15

    echo "\n";

    // 半角と全角が混在する文字列
    $mixedString = "PHP言語"; // "PHP" (3バイト) + "言" (3バイト) + "語" (3バイト) = 9バイト
    echo "文字列: '{$mixedString}'\n";
    echo "strlenの結果 (バイト数): " . strlen($mixedString) . " バイト\n"; // 出力: 9

    echo "\n";

    echo "※ 注意点:\n";
    echo "   strlenはバイト数を数えるため、全角文字を正しく文字数として数えたい場合は、\n";
    echo "   mb_strlen() (マルチバイト文字列関数) の使用を検討してください。\n";
}

// 関数の実行
demonstrateStrlenWithMultibyteCharacters();

?>

PHPのstrlen関数は、与えられた文字列が占めるバイト数を整数で返す内部関数です。この関数を利用する際は、長さを測りたい文字列をstring型の引数として渡します。そして、戻り値としてその文字列のバイト数がint型で返されます。

strlen関数は、半角英数字などのシングルバイト文字を1文字あたり1バイトとして数えます。しかし、日本語の全角文字のようなマルチバイト文字を扱う際には特別な注意が必要です。UTF-8エンコーディングの場合、日本語の全角文字は通常1文字あたり3バイトとして扱われるため、見た目の文字数とstrlenが返すバイト数が一致しないことがあります。

例えば、「Hello」という半角文字のみの文字列では、strlenは「5」を返します。これは、5つの文字がそれぞれ1バイトとして数えられた結果です。一方、「こんにちは」という全角文字の文字列では、見た目には5文字ですが、UTF-8エンコーディングでは各全角文字が3バイトとして計算されるため、strlenは「15」(5文字 × 3バイト)を返します。また、「PHP言語」のように半角と全角が混在する文字列の場合、「PHP」が3バイト、「言」が3バイト、「語」が3バイトとして数えられ、合計で「9」バイトが返されます。

このように、strlen関数は「文字数」ではなく「バイト数」を数えるため、特に全角文字を含む文字列の文字数を正確に取得したい場合には、マルチバイト文字列用の関数であるmb_strlen()の使用を検討してください。

PHPのstrlen関数は、文字列の「文字数」ではなく「バイト数」を返します。この点が初心者が間違いやすい重要なポイントです。特に日本語の全角文字のようなマルチバイト文字を扱う際には注意が必要です。UTF-8エンコーディングの場合、全角文字は通常1文字あたり3バイトとしてカウントされます。そのため、「こんにちは」のような5文字の文字列は、strlenで計算すると15バイトと出力されます。

見た目の文字数を正確に数えたい場合は、必ずマルチバイト文字列用のmb_strlen()関数を使用してください。mb_strlen()は、文字エンコーディングを指定して文字数を取得できるため、日本語のような多言語の文字列を適切に処理できます。mb_strlen()を利用する際は、スクリプトや文字列のエンコーディング(一般的にはUTF-8)が正しく設定されているかを確認することが重要です。

PHP strlenとmb_strlenで文字列長を測る

<?php

// strlen関数は、与えられた文字列のバイト数を返します。
// 日本語のようなマルチバイト文字を含む文字列の場合、1文字が複数バイトとしてカウントされるため、
// 期待する「文字数」とは異なる結果になる点に注意が必要です。
// 日本語などの文字数を正確に数える場合は、mb_strlen関数を使用します。

// 日本語を含む文字列を定義します。
$japaneseString = "こんにちは世界";

// strlen() を使って文字列の長さを取得します。
// この関数はバイト数を数えるため、日本語(UTF-8エンコーディングの場合)では
// 1文字が通常3バイトとしてカウントされます。
$lengthByStrlen = strlen($japaneseString);
echo "strlen() の結果(バイト数): " . $lengthByStrlen . "\n";

// mb_strlen() を使って文字列の長さを取得します。
// この関数は文字エンコーディングを指定することで、マルチバイト文字を1文字として正確に数えます。
// 通常、WebシステムではUTF-8エンコーディングを使用することが多いため、'UTF-8'を指定します。
$lengthByMbStrlen = mb_strlen($japaneseString, 'UTF-8');
echo "mb_strlen() の結果(文字数、UTF-8): " . $lengthByMbStrlen . "\n";

// 英語の文字列の場合、strlen() と mb_strlen() の結果は同じになります
// (1文字が1バイトとしてカウントされるため)。
$englishString = "Hello";
$lengthByStrlenEnglish = strlen($englishString);
$lengthByMbStrlenEnglish = mb_strlen($englishString, 'UTF-8');

echo "\n--- 英語の文字列の場合 ---" . "\n";
echo "strlen() の結果(バイト数): " . $lengthByStrlenEnglish . "\n";
echo "mb_strlen() の結果(文字数、UTF-8): " . $lengthByMbStrlenEnglish . "\n";

?>

PHPのstrlen関数は、引数として与えられた文字列のバイト数を整数値として返します。この関数は、string型の文字列を受け取り、そのバイト数をint型で戻します。

strlen関数を使用する際に特に注意が必要なのは、日本語のようなマルチバイト文字を含む文字列を扱う場合です。strlenはあくまで「バイト数」を数えるため、UTF-8エンコーディングの日本語の場合、1文字が通常3バイトとしてカウントされます。そのため、サンプルコードのように「こんにちは世界」という文字列では、strlenの結果は期待する「文字数」とは異なり、バイト数である21が返されます。

日本語などのマルチバイト文字の「文字数」を正確に数えたい場合は、mb_strlen関数を使用します。mb_strlen関数は、指定された文字エンコーディング(多くのWebシステムで使われる'UTF-8'など)に基づいて文字数をカウントするため、「こんにちは世界」は7文字として正確に数えられます。

対照的に、「Hello」のような英語の文字列は1文字が1バイトであるため、strlen関数とmb_strlen関数のどちらを使っても結果は同じになります。文字列の長さを取得する際には、対象となる文字列の内容(シングルバイトかマルチバイトか)を考慮し、適切な関数を選択することが重要です。

strlen関数は、与えられた文字列のバイト数を数えます。日本語のようなマルチバイト文字を含む文字列の場合、1文字が複数バイトとしてカウントされるため、期待する「文字数」とは異なる結果になる点に特に注意が必要です。文字数を正確に取得したい場合は、必ずmb_strlen関数を使用してください。mb_strlenを利用する際には、対象文字列の正しい文字エンコーディング(例: 'UTF-8')を引数で指定することが非常に重要です。これにより、マルチバイト文字も1文字として適切に処理されます。英数字のみの文字列ではstrlenmb_strlenの結果は一致しますが、文字エンコーディングの問題による不具合を防ぐため、文字数の取得には一貫してmb_strlenを使用する習慣をつけることをお勧めします。

【PHP8.x】strlen関数の使い方 | いっしー@Webエンジニア