在IIS部署CodeIgniter项目:默认控制器失效且出现PHP弃用错误
解决IIS部署CodeIgniter时的动态属性弃用错误
错误原因
你遇到的Creation of dynamic property CI_URI::$config is deprecated错误,是因为PHP 8.2及以上版本禁止动态创建类未声明的属性,而旧版本CodeIgniter的CI_URI类没有提前声明$config属性,直接赋值触发了弃用警告,导致默认控制器无法正常加载。
解决方案
1. 修复CodeIgniter核心类属性声明
找到项目中的core/URI.php文件,打开后在CI_URI类的顶部添加public $config;属性,示例如下:
class CI_URI { public $config; // 添加这行声明 public $uri_string; public $segments = array(); public $rsegments = array(); // ... 其他原有代码 }
保存文件后重新访问站点,警告会消失,默认控制器应该能正常加载。
2. 匹配CodeIgniter与PHP版本兼容性
如果你的CodeIgniter版本过旧(比如3.1.12及以下),本身不支持PHP 8.2+,建议:
- 升级CodeIgniter到最新稳定版(3.x分支或4.x,根据项目需求选择)
- 或者降级PHP到7.4版本,该版本允许动态创建类属性,不会触发此警告
3. 验证IIS关键配置(补充检查)
虽然你已配置相关模块,但可以再确认以下点:
- URL重写规则:确保web.config中的重写规则正确转发非文件/目录请求到index.php,示例规则:
<configuration> <system.webServer> <rewrite> <rules> <rule name="CodeIgniter Rewrite" stopProcessing="true"> <match url="^(.*)$" /> <conditions> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> </conditions> <action type="Rewrite" url="index.php/{R:1}" /> </rule> </rules> </rewrite> </system.webServer> </configuration> - 应用池设置:确保站点对应的应用池选择
.NET CLR版本为无托管代码,避免冲突。
4. 临时隐藏警告(不推荐长期使用)
如果需要临时恢复站点运行,可修改PHP的错误报告级别:
- 打开php.ini文件,设置
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT - 或者在项目根目录的index.php开头添加:
error_reporting(E_ALL & ~E_DEPRECATED);
注意:此方法只是隐藏警告,并未解决根本问题,长期使用可能掩盖其他潜在错误。
内容的提问来源于stack exchange,提问作者S. Thomas
相关产品推荐
相关产品推荐

