您好,感谢您的阅读。
我会直截了当地说:我有一个我使用CodeIgniter 1.7.3构建的网站项目,我非常喜欢使用它,但我一直在考虑升级到CI 2.0 +。
我尝试了一个直接副本,只是将控制器,模型和视图的文件夹移动到CI 2.0框架,但当我尝试查看我的页面时出现500服务器错误。
经过一些调查后,我发现所有控制器现在都必须使用“CI_Controller”作为其父类。另外我注意到如果你想在你的控制器类中包含一个构造函数,它必须使用语法“function __construct()”作为它的名字和父类。似乎CI 2.0+不再支持使用与类名具有相同名称的构造函数,例如“类博客扩展CI_controller {function Blogs(){parent :: __ construct();}}”不再受支持? 我一直在阅读CI更改日志,但我看到的只是错误修复和新功能,没有关于旧版CI的兼容性问题? 还有其他人知道任何其他秘密的小陷阱吗?
谢谢,
ħ
答案 0 :(得分:7)
CI 2.x删除了与PHP4的所有兼容性,并且还更新了许多标准,以便与PHP 5.3保持兼容。其中一个是您遇到的构造函数问题。从PHP 5.3开始,函数ClassName()
不再是类的构造函数,它只是另一个函数。您必须显式声明__construct
函数以执行在创建类的新实例时需要执行的任何任务。鉴于此,您应该看到在您的子构造函数中调用parent::ClassName()
不再有意义,因为该函数将不再是父的构造函数。
我最近遇到的另一个陷阱是如何处理$_GET
数组。在1.x版本中,您可以使用查询字符串传递额外信息,并仍使用URI段路由到控制器和函数。这对于AJAX调用尤其有用,在这些调用中,您可能并不总是知道在特定请求中发送到服务器和从服务器发送的所有参数。在2.x版本中,config.php文件包含一个新选项$config['allow_get_array']
。如果要使用查询字符串,则必须将其设置为TRUE
,否则输入类将清除$_GET
数组,作为每个请求的CI初始化例程的一部分。
一些不是陷阱但你可能会觉得有用的是config / autoload.php中的新选项,它允许你向项目中添加新的应用程序目录。如果您使用CI处理许多不同的项目并希望保留您在单个位置编写的任何有用库,则现在可以将该位置添加到$autoload['packages']
。 CI期望此数组中的任何路径都包含子目录“controllers”,“models”,“libraries”和“helpers”。如果您没有这些目录,它将不会抱怨,但您至少需要它们用于您要加载的任何内容,即库将与主应用程序文件夹一样存在/库中。
答案 1 :(得分:6)
您是否阅读了从1.7.x to 2.x升级的官方指南?
所以简而言之
更新父构造函数调用
类哇扩展CI_Controller {
function __construct() { parent::__construct(); //your stuff } function index() { // just for example } }