はじめに
英語のタイトルや固有名詞を扱う場面で、「文字列の先頭の文字だけを大文字にしたい」というケースは意外とよくあります。たとえば "hello world" を "Hello world" に変換したい、あるいはユーザー入力の名前を整形して表示したい、といった場面です。
こうした処理を簡単に実現してくれるのが ucfirst() 関数です。名前は “uppercase first character” の略で、その名の通り文字列の最初の1文字だけを大文字に変換します。一見単純な関数ですが、マルチバイト文字(日本語など)には対応していない、ucwords() との違いが分かりにくい、といった注意点もあります。本記事では基本的な使い方から、実践的な活用例、そしてよくある落とし穴までじっくり解説します。
関数概要
| 項目 | 内容 |
|---|---|
| 関数名 | ucfirst() |
| 所属拡張 | コア関数(標準で常に利用可能) |
| シグネチャ | ucfirst(string $string): string |
| 引数 | $string — 変換対象の文字列 |
| 戻り値 | 先頭の1文字が大文字に変換された文字列 |
| 対応バージョン | PHP 4以降 |
| 対になる関数 | lcfirst()(先頭の1文字を小文字にする) |
| 類似関数 | ucwords()(各単語の先頭を大文字にする) |
| マルチバイト対応 | 非対応(ASCII文字のみが対象) |
変換の流れ(イメージ図)
入力文字列
"hello world"
│
▼
ucfirst()
│
│ 先頭の1文字だけを対象に
│ 小文字 → 大文字 変換
▼
"Hello world"
▲
└─ 2文字目以降は変更されない
ポイントは、ucfirst() が変換するのは文字列全体の先頭1文字のみであり、各単語の先頭ではないという点です。「複数単語からなる文字列の、すべての単語の先頭を大文字にしたい」場合は ucwords() を使う必要があります。この違いを混同すると、意図した見た目にならないことがあります。
実践サンプル7選
例1:基本的な使い方
<?php
class BasicCapitalizer
{
public function capitalize(string $string): string
{
// 文字列の先頭1文字だけを大文字に変換する
return ucfirst($string);
}
}
$capitalizer = new BasicCapitalizer();
echo $capitalizer->capitalize('hello world') . PHP_EOL; // "Hello world"
echo $capitalizer->capitalize('php') . PHP_EOL; // "Php"
例2:フォーム入力された名前を整形するクラス
<?php
class NameFormatter
{
/**
* ユーザーが小文字で入力した名前の先頭を
* 大文字に整形して表示用に整える
*/
public function format(string $rawName): string
{
$trimmed = trim($rawName);
$lowered = strtolower($trimmed);
// 先頭のみを大文字化することで自然な表記にする
return ucfirst($lowered);
}
}
$formatter = new NameFormatter();
echo $formatter->format(' jOHN ') . PHP_EOL; // "John"
echo $formatter->format('ALICE') . PHP_EOL; // "Alice"
例3:文の先頭だけを大文字にするクラス(文単位の処理)
<?php
class SentenceCapitalizer
{
/**
* "。"や"."で区切られた複数の文それぞれの
* 先頭文字を大文字にする(英語文を想定)
*/
public function capitalizeSentences(string $text): string
{
$sentences = preg_split('/(?<=[.!?])\s+/', trim($text));
$capitalized = array_map(
fn (string $sentence) => ucfirst(strtolower($sentence)),
$sentences
);
return implode(' ', $capitalized);
}
}
$capitalizer = new SentenceCapitalizer();
echo $capitalizer->capitalizeSentences('hello world. this is PHP! great, isn\'t it?') . PHP_EOL;
// "Hello world. This is php! Great, isn't it?"
例4:ucfirstとucwordsの挙動比較
<?php
class CapitalizationComparator
{
/**
* ucfirst()(先頭1文字のみ)と
* ucwords()(各単語の先頭)の違いを比較する
*/
public function compare(string $string): array
{
return [
'ucfirst' => ucfirst($string),
'ucwords' => ucwords($string),
];
}
}
$comparator = new CapitalizationComparator();
print_r($comparator->compare('the quick brown fox'));
// ucfirst: "The quick brown fox" ← 先頭の単語だけ
// ucwords: "The Quick Brown Fox" ← すべての単語
例5:クラス名やメソッド名を生成するコードジェネレーター
<?php
class ClassNameGenerator
{
/**
* スネークケースの文字列(例: "user_profile")を
* キャメルケースのクラス名(例: "UserProfile")に変換する
*/
public function toClassName(string $snakeCase): string
{
$words = explode('_', $snakeCase);
// 各単語の先頭を大文字化してから連結する
$capitalizedWords = array_map(
fn (string $word) => ucfirst(strtolower($word)),
$words
);
return implode('', $capitalizedWords);
}
}
$generator = new ClassNameGenerator();
echo $generator->toClassName('user_profile') . PHP_EOL; // "UserProfile"
echo $generator->toClassName('http_request_handler') . PHP_EOL; // "HttpRequestHandler"
例6:マルチバイト文字を安全に扱うための拡張実装
<?php
class MultibyteSafeCapitalizer
{
/**
* ucfirst()はマルチバイト文字に非対応のため、
* mb_*系関数を組み合わせて安全に先頭文字を大文字化する
*/
public function capitalizeSafely(string $string, string $encoding = 'UTF-8'): string
{
if ($string === '') {
return $string;
}
$firstChar = mb_substr($string, 0, 1, $encoding);
$rest = mb_substr($string, 1, null, $encoding);
// mb_strtoupper()で先頭文字のみを大文字化する
return mb_strtoupper($firstChar, $encoding) . $rest;
}
}
$safeCapitalizer = new MultibyteSafeCapitalizer();
echo $safeCapitalizer->capitalizeSafely('école') . PHP_EOL; // "École"
// ucfirst('école') では正しく変換されない点に注意
例7:バリデーションエラーメッセージを整形するクラス
<?php
class ValidationMessageFormatter
{
/**
* バリデーションルールから生成される小文字のエラーメッセージを
* 表示用に先頭大文字の文章として整える
*/
public function format(string $fieldName, string $ruleMessage): string
{
$message = sprintf('%s %s', $fieldName, $ruleMessage);
// メッセージ全体の先頭だけを大文字にして自然な文にする
return ucfirst($message) . '.';
}
}
$formatter = new ValidationMessageFormatter();
echo $formatter->format('email', 'is required') . PHP_EOL; // "Email is required."
echo $formatter->format('password', 'must be at least 8 characters') . PHP_EOL;
関連関数との比較
| 関数 | 役割 | ucfirstとの違い |
|---|---|---|
ucfirst() | 文字列全体の先頭1文字を大文字にする | 本記事の対象。対象は文字列の先頭のみ |
lcfirst() | 文字列全体の先頭1文字を小文字にする | ucfirst() の逆の変換を行う |
ucwords() | 各単語の先頭文字を大文字にする | 対象がすべての単語である点が異なる |
strtoupper() | 文字列全体をすべて大文字にする | 先頭だけでなく全体を変換する |
mb_convert_case() | マルチバイト対応の大文字/小文字変換 | MB_CASE_TITLE などを指定することで、マルチバイト文字にも対応した先頭大文字化が可能 |
よくある落とし穴(注意点)
- マルチバイト文字(日本語やアクセント付き文字)には対応していない
ucfirst()はASCII文字を前提とした関数のため、"école"のようなアクセント付き文字や日本語には正しく機能しません。マルチバイト対応が必要な場合はmb_substr()とmb_strtoupper()を組み合わせる、またはmb_convert_case()を使う必要があります。 ucwords()と混同しやすい 複数単語からなる文字列すべての単語を大文字化したい場合に誤ってucfirst()を使ってしまうと、2単語目以降が小文字のままになってしまいます。- 先頭以外の文字を小文字化しない
ucfirst("HELLO")の結果は"HELLO"のままです(先頭文字が既に大文字のため変化なし)。文字列全体を「先頭大文字・残りは小文字」にしたい場合は、事前にstrtolower()で全体を小文字化してからucfirst()を適用する必要があります(例2を参照)。 - 空文字列を渡した場合の挙動 空文字列
""を渡した場合はエラーにはならず、そのまま空文字列が返ります。ただし、独自のマルチバイト対応関数を実装する際は、この空文字列のケースを明示的にハンドリングしておくと安全です(例6を参照)。 - 先頭が数字や記号の場合は何も起こらない
ucfirst("123abc")のように先頭が英字でない場合、その文字は大文字化の対象とならず、そのまま返されます。エラーにはならない点を理解しておきましょう。
まとめ
| 観点 | まとめ |
|---|---|
| 何をする関数か | 文字列全体の先頭1文字だけを大文字に変換する |
| 主な用途 | 名前の整形、文の先頭大文字化、クラス名生成、エラーメッセージの整形など |
| マルチバイト対応 | 非対応。日本語やアクセント付き文字にはmb_substr()+mb_strtoupper()またはmb_convert_case()を使う |
| 対になる関数 | lcfirst()(先頭を小文字に)、ucwords()(各単語の先頭を大文字に) |
| 注意点 | マルチバイト非対応、ucwords()との混同、先頭以外は変換されないこと |
ucfirst() はシンプルながら、名前の整形やコード生成など様々な場面で重宝する関数です。ただしマルチバイト文字への非対応という制約があるため、日本語を扱うプロジェクトでは mb_* 系関数との組み合わせを検討することを忘れないようにしましょう。
