一般社団法人BOSS-CON JAPAN / PHP技術者認定機構 さんのキャンペーンに応募して問題集をもらったので、最近はPHP7技術者認定初級試験の勉強をしています。
幸い今まで勉強した内容でほぼカバーできるためハードルが高いという印象はなく、問題集が届いて1週間で1巡を終え、細かな言語仕様などを確認しながら2巡目をやっているところです。
こちらの問題集にある、第2章 テキストと数の操作 の項目に「strcasecmp()」というPHPの組み込み関数が出てくるのですが、自分は使ったことがなく挙動がイメージできなかったので、少し検証をしてみることにしました。
PHPマニュアルより:
strcasecmp — 大文字小文字を区別しないバイナリセーフな文字列比較を行う
https://www.php.net/manual/ja/function.strcasecmp.php
PHPのマニュアルによると、
大文字小文字を区別しないバイナリセーフな文字列比較を行います。
str1
がstr2
より小さい場合は負、str1
がstr2
より大きい場合は正、等しい場合は 0 を返します。
strcasecmp() の例
<?php $var1 = "Hello"; $var2 = "hello"; if (strcasecmp($var1, $var2) == 0) { echo '$var1 is equal to $var2 in a case-insensitive string comparison'; } ?>
(上記のソースコードの例では $var1 is equal to $var2 〜が出力される)
ということですが、
- strcasecmpの意味と、似ている関数は?
- 負の数・正の数ってどのくらいの数値を返すの?
- どういうときに使うの?
という疑問がまず頭をよぎりました。
そういう訳で早速検証していきます。
1. strcasecmp の意味について
まず関数名のstrcasecmpですが、
- 文字列を表す string
- 大文字・小文字の区別を意味する case
- 比べる・比較するという意味の英単語 compare
これら3つの合体+略語かと思われます。
caseという単語自体が大文字小文字の区別を意味するのに、関数の挙動としては大文字小文字の区別「しない」のは少々紛らわしいかもしれません。
ちなみに似た関数で strcmp という組み込み関数もあり、こちらは大文字・小文字を区別します。
PHPマニュアルより:
strcmp — バイナリセーフな文字列比較
https://www.php.net/manual/ja/function.strcmp.php
2. 負の数・正の数っていうけど、どのくらいの数値を返すの?
手元の実行環境で検証してみました。
- PHPのバージョン:php7.3.1
CASE 1:
$var1 = "Helloあ"; $var2 = "Hello"; $res = strcasecmp($var1, $var2); var_dump($res); // 結果:int(3)
CASE 2:
$var1 = 'Hello'; $var2 = 'Helloab'; $res = strcasecmp($var1, $var2); var_dump($res); // 結果:int(-2)
CASE 3:
$var1 = 'Hello'; $var2 = 'Hello漢字'; $res = strcasecmp($var1, $var2); var_dump($res); // 結果:int(-6)
CASE 4:
$var1 = 'Hello'; $var2 = 'hello'; $res = strcasecmp($var1, $var2); var_dump($res); // 結果:int(0)
CASE 5:
$var1 = '5'; $var2 = 5; $res = strcasecmp($var1, $var2); var_dump($res); // 結果:int(0)
要するに、
- 第一引数の文字列のバイト数が第二引数よりも少ない時は、少ないバイト数だけ負の数で返す
- 第一引数の文字列のバイト数が第二引数よりも多い時は、多いバイト数だけ正の数で返す
ということのようです。
巷ではよく「英語は1バイト、日本語は2バイト」のような表現を見たりもしますが、ひらがな・カタカナ・漢字などの日本語は3バイトのものが多いです。(全てではありませんが)
そのため、第一引数にひらがなの「あ」を追加したものは、正の整数「3」が返り値となり、第二引数に漢字二文字を追加したものは負の整数「-6」が返り値となっています。
3. strcasecmpはどういうときに使うの?
バリデーションで使うという記事を見ましたが、自分は使ったことがありませんでした。
比較演算子「==」で文字列比較を行うと、型の比較は行わない& ‘5user’ == 5 (true) が通ってしまうし、「===」で厳密に型のチェックを行うと ‘5’ === 5 (false) となってちょっと使いづらい。そういうときに重宝しそうですが、しかし例えばパスワードのチェックであれば大文字・小文字を区別すると思うので、strcasecmp より strcmp の方が良さそうです。ユーザ名とかなら strcasecmp の方か良いかな。
パスワードを入力させるような場面だとデータベースに繋ぐことが多く、エラーはPDOなりフレームワークなりが吐くものを処理するし、ユーザにパスワードを2回入力してもらってチェックしたいときは厳密な型比較があっても良いしで、まだまだ勉強が必要だなと思った次第。
今日はそんな感じです。
この記事へのコメントはありません。