【PHP 8.2/8.4対応】「strpos()廃止」されるのかと ${var} 非推奨化について調べてみた

📌 2026年8月時点の情報

本記事はPHP 8.2〜PHP 8.4時点の仕様をもとに作成しています。

PHPではバージョンアップに伴い、非推奨(Deprecated)や新機能の追加が継続的に行われています。

本記事では、PHP公式マニュアルやRFC(仕様提案書)の内容に加え、Amazon Linux 2023 + PHP 8.4環境で実際に動作検証した結果も交えながら解説します。

はじめに

PHP 8系へのアップデートが進む中、開発現場で「あの関数や構文が使えなくなるらしい」という話を耳にすることが増えています。

特に話題になりやすいのが、strpos() 関数と、${var}(波括弧内のドル記号)による文字列内変数展開です。

本記事では、次の3点について整理します。

  • strpos() は本当に廃止されるのか
  • ${var} はなぜ非推奨になったのか
  • PHP 8.4では実際にどのような挙動になるのか

噂や断片的な情報ではなく、公式仕様と実際の検証結果をもとに確認していきます。


【誤解を解く】strpos() は廃止されていない

結論から言うと、strpos() はPHP 8.4でも廃止されていません。

現在も標準関数として提供されており、文字列検索のための関数として引き続き利用できます。

💡 エンジニア向けポイント
  • strpos() は今後も利用可能
  • 廃止予定という事実はない
  • 検索位置を取得する用途では現在も標準的な関数

なぜ「廃止」と誤解されるのか?

PHP 8.0では、新たに str_contains() が追加されました。

従来、文字列に特定の文字列が含まれているか確認する場合は、strpos() を使用して次のように記述することが一般的でした。

if (strpos($haystack, $needle) !== false) {
    // 含まれている
}

この書き方では、戻り値として

  • 先頭で見つかった場合は 0
  • 見つからなかった場合は false

が返るため、!== false による厳密比較が必要になります。

この挙動を理解していないと、次のようなバグが発生することがあります。

// NG例
if (strpos($haystack, $needle)) {
    // ...
}

検索文字列が先頭(0文字目)に存在する場合、戻り値は 0 となるため、この条件式では「見つからなかった」と判定されてしまいます。

⚠️ 注意

strpos() が危険なのではなく、「0」と「false」を区別しなければならないことが、初心者がつまずきやすいポイントです。

PHP 8.0で追加された str_contains()

PHP 8.0以降は、存在チェック専用として str_contains() が追加されました。

if (str_contains($haystack, $needle)) {
    // 含まれている
}

戻り値は true または false のみとなるため、より直感的で読みやすいコードになります。

そのため、現在では存在チェック用途では str_contains() の利用が推奨されています。

この話題が一人歩きした結果、「strpos() 自体が廃止された」という誤解が広まったと考えられます。

現場での使い分け

用途 推奨する関数
文字列が含まれているか判定したい str_contains()
見つかった位置を取得したい strpos()
✔ この章のポイント
  • strpos() は廃止されていない
  • PHP 8.0で str_contains() が追加された
  • 存在チェックでは str_contains() が推奨される
  • 位置取得では引き続き strpos() を利用する

【要対応】${var} 構文の非推奨(Deprecated)と今後の廃止

一方で、ダブルクォーテーション内で使用する ${var} 構文については、PHP 8.2以降で対応が必要になっています。

現在はまだ利用できますが、将来的な削除が予定されているため、早めの対応が推奨されています。

現在のステータス

PHPバージョン 状態
PHP 8.2 非推奨(Deprecated)
PHP 8.3 非推奨のまま利用可能
PHP 8.4 非推奨のまま利用可能
PHP 9.0 削除予定

書き方の違い

$name = "World";

// ❌ 非推奨(PHP 8.2〜)
echo "Hello ${name}";

// ✅ 推奨
echo "Hello {$name}";

// ✅ 単純な変数ならこちらでも可
echo "Hello $name";
⚠️ 注意

非推奨となっているのは ${var} 構文です。{$var} は引き続き推奨される記法であり、非推奨ではありません。

なぜ非推奨になったのか?

${var} は、${expr}(可変変数を扱う構文)と見た目が似ている一方で意味が異なるため、構文が分かりにくく、混乱を招きやすいという理由から非推奨となりました。

PHPでは、より一貫性のある {$var} を利用することが推奨されています。

💡 エンジニア向けポイント
  • {$var} は今後も利用可能
  • 修正対象は ${var} のみ
  • PHP 9では削除予定のため、早めの修正がおすすめ

【実検証】Amazon Linux 2023 + PHP 8.4で ${var} を動かしてみた

実際に Amazon Linux 2023 + PHP 8.4 環境を構築し、次のコードを実行して挙動を確認しました。

<?php

$name = "PHP 8.4";

echo "Hello ${name}\n";

検証結果

実行した結果は次のとおりでした。

  • 処理は正常終了する
  • Hello PHP 8.4 と正しく出力される
  • Fatal Error にはならない
  • Deprecated(非推奨)の警告のみ出力される

つまり、PHP 8.4時点ではまだ動作するものの、非推奨として警告が出る状態となっています。

実際の表示例

Deprecated: Using ${var} in strings is deprecated ...
Hello PHP 8.4
✔ 検証結果まとめ
  • PHP 8.4では Fatal Error にはならない
  • Deprecated警告のみ出力される
  • 処理自体は最後まで正常に実行される

もう一つ分かったこと

今回検証した Amazon Linux 2023 + PHP 8.4 環境では、error_reporting の設定が E_ALL & ~E_DEPRECATED となっていたため、Deprecated警告は初期状態では表示されませんでした。

そのため、一見すると問題なく動作しているように見えてしまいます。

⚠️ 環境によって挙動は異なります

今回確認した内容は、Amazon Linux 2023 + PHP 8.4環境での検証結果です。

PHPの error_reportingdisplay_errors の設定、利用しているフレームワークや実行環境によっては、Deprecated警告が表示される場合もあれば表示されない場合もあります。

そのため、「警告が表示されない=非推奨ではない」という意味ではありません。

PHP 9.0では ${var} 構文が削除される予定です。

現在は問題なく動作しているように見えるコードでも、PHP 9.0へアップデートした際には、該当箇所が実行されると Fatal Error により処理が停止する可能性があります。


企業が取るべき対策と一括リファクタリング

PHP 7.x時代から運用されているシステムでは、${var} 構文が現在も残っているケースは珍しくありません。

PHP 8.4では動作するため気付きにくいものの、PHP 9.0では削除予定となっているため、早めの対応を進めておくことをおすすめします。

💡 エンジニア向けポイント
  • 手作業での置換は漏れや修正ミスの原因になりやすい
  • 静的解析ツールを活用すると効率的に検出できる
  • 自動変換ツールを利用すると大規模プロジェクトでも安全に対応しやすい

1. PHP CodeSniffer(PHPCompatibilityなど)で検出

まずはコードベース内に ${var} 構文がどの程度残っているかを把握しましょう。

PHP CodeSniffer(PHPCS)に PHPCompatibility などのルールセットを組み合わせることで、PHPバージョン間の互換性チェックや非推奨構文の検出を行えます。

phpcs --standard=PHPCompatibility src/

CI/CDパイプラインへ組み込んでおけば、新たな非推奨構文の混入防止にも役立ちます。


2. Rectorによる自動一括変換

既存プロジェクト全体を修正する場合は、Rector を利用すると効率的です。

PHP 8.2向けルールを適用することで、${var}{$var} へ自動変換できます。

use Rector\Config\RectorConfig;
use Rector\Set\ValueObject\SetList;

return RectorConfig::configure()
    ->withSets([
        SetList::PHP_82,
    ]);

変換後は、ユニットテストや結合テストを実施し、意図しない変更が発生していないことを確認しましょう。

✔ おすすめの対応手順
  1. PHPCS + PHPCompatibilityで対象コードを検出する
  2. Rectorで一括変換を実施する
  3. テストを実施して動作確認を行う
  4. PHP 9.0へアップデートする前に修正を完了させる

まとめ

今回調査した内容を整理すると、次のようになります。

項目 結論
strpos() 廃止されていない。位置取得では今後も利用する。
str_contains() 存在チェック用途ではこちらの利用が推奨される。
${var} PHP 8.2で非推奨、PHP 9.0で削除予定。
PHP 8.4での挙動 Deprecated警告のみで動作は継続する。
推奨対応 PHPCSやRectorを活用し、早めに修正する。

✅ 最後に

strpos() が廃止された」という情報は誤解であり、現在も標準関数として利用できます。

一方、${var} 構文はPHP 8.2から非推奨となっており、PHP 9.0で削除予定です。

今回、Amazon Linux 2023 + PHP 8.4環境で検証したところ、Fatal Errorにはならず、Deprecated警告のみで動作することを確認しました。ただし、環境によってはDeprecated警告が表示されないケースもあるため、気付かないまま非推奨構文が残ってしまう可能性があります。

PHP 9.0への移行を見据え、静的解析ツールや自動変換ツールを活用しながら、計画的にコードを見直していくことをおすすめします。


参考情報

  • PHP公式マニュアル「strpos()」
  • PHP公式マニュアル「文字列(String)」
  • PHP RFC:str_contains()
  • PHP RFC:Deprecate ${} string interpolation
  • PHPCompatibility(PHP_CodeSniffer Ruleset)
  • Rector Official Documentation

ここまで読んでいただき、ありがとうございます。もしこの記事の技術や考え方に少しでも興味を持っていただけたら、ネクストのエンジニアと気軽に話してみませんか。

  • 選考ではありません
  • 履歴書不要
  • 技術の話が中心
  • 所要時間30分程度
  • オンラインOK

エンジニアと話してみる

関連リンク

AI・クラウド・データ分析のご相談はネクスト株式会社までお問い合わせください。