CodeIgniter 3 動的プロパティ非推奨警告の修正
問題概要
CodeIgniter 3.x をPHP 8.2以降の環境で実行する際、以下のような警告が発生することがあります:
Severity: 8192
Message: Creation of dynamic property CI_URI::$config is deprecated
Filename: core/URI.php
Line Number: 102
この警告の原因: PHP 8.2以降、クラスで事前に宣言せずに動的にプロパティを生成する仕様(動的プロパティ)が非推奨となりました。CodeIgniter 3.x のコアクラスでは動的プロパティが使われているため、この互換性問題が発生します。
注意
本質的な解決にはコード修正が必要です。エラーを無視することは後続の問題を見逃す原因となるため推奨しません。
主な修正方法
以下の対策はいずれもシステムファイルの直接編集が必要です。実施前に必ずバックアップを取ってください。
対策1: #[\AllowDynamicProperties]
属性の追加(推奨)
最も簡単で広く採用されている方法は、影響を受けるクラスに #[\AllowDynamicProperties]
属性を追加することです。これにより動的プロパティの使用が明示的に許可されます。
#[\AllowDynamicProperties]
class CI_URI {
修正が必要な主なクラスファイルと対応箇所:
ファイルパス | クラス名 |
---|---|
/system/core/URI.php | class CI_URI |
/system/core/Router.php | class CI_Router |
/system/core/Loader.php | class CI_Loader |
/system/core/Controller.php | class CI_Controller |
/system/database/DB_driver.php | abstract class CI_DB_driver |
具体的には各ファイルのクラス宣言直前に #[\AllowDynamicProperties]
を追加します:
// 例: /system/core/URI.php
#[\AllowDynamicProperties]
class CI_URI {
// ...既存のコード...
}
参考
この修正方法はCodeIgniterコミュニティで公式に提案されているソリューションです。詳細はGitHub PRコメントを参照。
対策2: プロパティの事前宣言(代替案)
動的プロパティとなる変数をあらかじめクラス内で宣言する方法もあります。例としてURI.php
のCI_URI
クラスに$config
プロパティを追加します:
class CI_URI {
/**
* CI Config インスタンス
* @var CI_Config
*/
public $config;
// ...既存のコード...
}
ただし、この方法では全ての動的プロパティが使用されている箇所を個別に特定して宣言する必要があるため、作業量が増える可能性があります。
回避策: 非推奨警告の一時的抑制(非推奨)
どうしても修正が困難な場合に限り、エラーレポートレベルから非推奨警告を除外する方法があります。ただし推奨しません。
php.iniで設定する場合:
error_reporting = E_ALL & ~E_DEPRECATED
PHPコード内で設定する場合:
<?php
ini_set('error_reporting', E_ALL & ~E_DEPRECATED);
注意
この方法は根本的な問題を隠蔽するだけです。将来のPHPバージョンで動的プロパティが完全に禁止された場合、動作しなくなるリスクがあります。
根本的解決と将来展望
上記の修正はすべて一時的な回避策です。長期的には公式の解決策を待つか、以下を検討してください:
- CodeIgniter 4への移行: CodeIgniter 4ではこの問題が根本的に修正されています。本番環境では早めの移行計画を推奨します。
- 公式パッチ適用: 公式リポジトリで修正パッチがリリースされるのを待つ(Pull Request #6193参照)
まとめ
PHP 8.2+環境でCodeIgniter 3を使用する際の動的プロパティ警告には、以下を優先的に選択してください:
#[\AllowDynamicProperties]
属性の追加(全影響クラスに対応)- プロパティ事前宣言(影響箇所が明確な場合)
- 最後の手段として警告抑制(非推奨)
本記事のソリューション実装後、アプリケーションの全機能テストを必ず実施してください。