【问题标题】:OOP PHP Codeigniter Controller HierarchyOOP PHP Codeigniter 控制器层次结构
【发布时间】:2011-05-10 22:16:12
【问题描述】:

我的 OOP 概念有点问题。我会尽力解释。

我有这门课

class Application_controller extends CI_Controller{
     public function addItem(){
        "some code to add the item to the database (working)";
     }
}

我还有另一个类,两个控制器:

require_once 'application_controller.php';
class Contact extends Application_controller{
     public function __construct(){
         parent::__construct("variables needed");
     }
}

在联系人的视图添加中,我添加了以下操作 contact/addItem

好的,现在这是我对 OOP 的总体了解。

方法 addItem 不应该是 Contact 类的一部分,因为它扩展了 Application_controller 吗?

我之所以问,是因为当我提交表单时,我没有得到任何操作,并且当我在类 Contact 中添加方法 addItem 时,它会覆盖父类。

【问题讨论】:

  • 我从未接触过 CI,但您对 OOP 的看法确实是正确的。但是,您的 Contact 构造函数中缺少 function 关键字
  • ehehe 是的,我是 =) 但只有在这里 :P 在真正的代码上我有它 =P 我可能饿了,吃了它 =)

标签: php codeigniter controller form-submit hierarchy


【解决方案1】:

您没有采取任何行动的原因是 codeigniter 在您的 Contact 类中找不到方法 addItem (更新:这可能是由于 CodeIgniter 路由的工作方式)。解决方案是让 addItem 成为模型中的通用方法,将数据存储在表中,将其移动到模型中,然后将模型加载到控制器中。

创建应用程序/models/writeModel.php

class writeModel extends CI_Model{
  function addItem(){
    // code here
  }
}

在您的控制器中:

    class Contact extends Controller{
       function __controller(){
          parent::Controller();
          $this->load->model('writeModel');
       }

       function somefunction(){
          $this->writeModel->addItem(); // call the method here
       }
    }

参考:CodeIgniter Models

【讨论】:

  • 鉴于 Contact 扩展了 Application_controller,它确实应该有一个公共的 addItem 方法,除非 CI 对控制器类做了一些非常奇怪的事情
  • 我同意@Phil 的观点,但我看不出反对的理由。这听起来确实很奇怪,但我不会让它通过 CodeIgniter 来做一些时髦的反射,而不是迭代继承链。 Shivaas,如果你想接受这个答案,你应该找到继承问题的参考。
  • 这与 CodeIgniter 如何路由到方法有关。我的猜测是它不会路由到继承的公共方法。
  • 我已经更新了我的答案,使其更加清晰 - 我将尝试找到有关为什么 codeigniter 不路由到继承方法的参考。
  • 从概念上讲,Elkas 试图做的就是发现,但是当 CodeIgniter 加载 Contact 类时,PHP 没有在 contact.php 中找到 'Application_controller' 类,从而引发了致命错误。我的猜测是 Elkas 在他的 PHP 中有错误报告,因此看到一个空白响应。为此,需要在 Contact 控制器文件中使用 require('...') 语句。
【解决方案2】:

这里的问题(除了 OP 中的几个语法错误)可能是“Contact”不能扩展“Application_controller”,因为它不知道它存在。如果我们这样设置测试:

/controllers/Test.php

class Test extends CI_Controller
{
    function __construct()
    {
        parent::__construct();
    }

    function index()
    {
        echo 'test';
    }
}

/controllers/TestTwo.php

require_once("Test.php");

class TestTwo extends Test    
{
    function __construct()
    {
        parent::__construct();
    }
    function index()
    {
        parent::index();
        echo ' and test two';
    }
}

我们将通过导航到 appurl/TestTwo/ 获得所需的“测试和测试二”输出。这是因为 TestTwo 知道 Test。删除 require(); TestTwo.php 中的行会破坏这种关系。

从 TestTwo 中删除 index() 函数将导致通过导航到 appurl/TestTwo/ 仅输出“test”。

【讨论】:

  • 嘿,伙计。我有这样的代码,我只是没有把明显的代码放在这里 =P 对不起,如果我误会你了。确实是这样工作的,但是如果我的 addItem 方法的行为在每个类控制器中都是相同的,那么如果我必须在子类上覆盖它然后调用父方法,那么我有什么意义将它放在父类上?这对我来说没有意义,因此我把它放在父类上,所以我不必在子类上覆盖它。但我不知道 Codeigniter 的内部工作以及他是否接受父控制器的继承方法
  • 我不确定我是否遵循。如果您不想创建子 index() 您也没有。父级仍会触发。
【解决方案3】:

我在 Codeigniter 论坛上找到了一些类似问题的答案。它是这样说的

您的 ShopDownloads 将从 Shop 控制器继承(方法、属性等)。正如视频教程中所说,你必须从控制器类继承你的类,以便它可以继承 codeigniter 为你提供的所有属性和方法。

苏海布,

帖子的链接是http://codeigniter.com/forums/viewthread/102718/#518120

我不知道这是怎么做到的,但它今天有效。应该是服务器吧。只需要重新启动。

解决了,只需今天启动服务器并开始开发 LOL。谢谢你们的时间。

问候,

埃尔卡斯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    • 2012-10-16
    • 1970-01-01
    相关资源
    最近更新 更多