4

您好,感谢您的阅读。

我直截了当:我有一个网站项目,我一直在使用 CodeIgniter 1.7.3 构建,我非常喜欢使用它,但是我一直在考虑升级到 CI 2.0+。

我尝试直接复制,只是将控制器、模型和视图的文件夹移至 CI 2.0 框架,但当我尝试查看我的页面时出现 500 服务器错误。

在做了一些调查之后,我发现你所有的控制器现在都必须使用“CI_Controller”作为它们的父类。我还注意到,如果你想在你的控制器类中包含一个构造函数,它必须使用语法“function __construct()”作为它的名称和父类的名称。似乎 CI 2.0+ 不再支持使用与类名同名的构造函数,例如不再支持“class Blogs extends CI_controller{ function Blogs(){parent::__construct();}}”?我一直在阅读 CI 更改日志,但我看到的只是错误修复和新功能,与旧版本 CI 的兼容性问题一无所知?有没有其他人知道任何其他秘密的小陷阱?

谢谢,

H

4

2 回答 2

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”。如果您没有这些目录,它不会抱怨,但您至少需要它们来处理您打算加载的任何内容,即库将与主应用程序文件夹一样位于 /libraries 中。

于 2011-06-18T05:18:54.243 回答
6

您是否阅读过从 1.7.x升级到 2.x 的官方指南?

所以简而言之

  • 更新模型和控制器以扩展 CI_Model 和 CI_Controller
  • 更新父构造函数调用

    类哇扩展 CI_Controller {

          function __construct()
          {
              parent::__construct();
                        //your stuff
          }
    
          function index()
          {
                   // just for example 
          }
        }
    
于 2011-06-18T04:59:09.160 回答