Codeigniter和多重继承

3
我一直在使用Codeigniter构建一个中等规模应用程序的前端,并且遇到了一个关于PHP继承的问题。在遵循MVC架构时,我发现我在多个模型中重复编写了很多代码,于是决定创建一个公共模型,其他模型可以从中继承。这很简单。然而,现在我遇到了一些在公共模型类中定义的函数问题。
下面是我正在做的事情的概述:
<?php

/**
 * Common Model
 *
 */
 class DeviceModel extends Model {

 function DeviceModel() {
     parent::Model();     
 }

 public function getDeviceId($d) { // this is just example code. }

 public function getDeviceInfo($id) {    

    $selectStmt = "SELECT BLAH, BLAH2 FROM YADDAYADDA...";

    $query = $this->db->query($selectStmt, array($id));

    if ($query->num_rows() > 0) {
        return $query->result();
    }
  }
}

?>

这是子类:

<?php
require_once('devicemodel.php');
class ManageModel extends DeviceModel {

    function ManageModel() {
        parent::DeviceModel();
    }
    function getDropDownList($parkId,$tableName,$userclass) {
        $arrCmds = array();
        $arrHtml = array();

        $deviceInfo = parent::getDeviceInfo($parkId);
        $did = parent::getDeviceId($deviceInfo);

        foreach ($deviceInfo as $device) {
            $cmds = $this->getDeviceCommands($device->dtype,$tableName,$userclass);
            array_push($arrCmds,$cmds);
        }

        //
        // **After the refactor, I am receiving Undefined Offsets for this loop.**
        //
        for ($i=0; $i<sizeof($arrCmds); $i++) {
            $html = $this->generateHtml($arrCmds[$i],$did[$i]);
            array_push($arrHtml,$html);
        }

        return $arrHtml;
    }        

在CodeIgniter中使用多重继承是否存在问题?我对PHP和CodeIgniter都比较陌生。谢谢。

感谢您的关注。


1
我在CodeIgniter中完全做过这种事情,从来没有引起问题。这可能与getDeviceInfo中的逻辑有关...一些随机想法/我的约定是将getDeviceInfo命名为$this->getDeviceInto,而不是使用父引用,并且使用arrCmds[] = $cmds代替array_push。 - Ken Struys
1个回答

0

我没有看到哪里有多重继承。

我也在使用CodeIgniter,我需要对它的控制器进行子类化,这样我的所有控制器都可以从我的控制器继承,而不是直接从CodeIgniter继承。

CodeIgniter有原生方法可以用来扩展自己的类。或者你可以打开model.php文件(在system/libraries/中),在if (!defined ...)之后,在文件顶部添加你的ManageModel类的代码。

此外,这里有一个链接可以扩展模型http://www.askaboutphp.com/50/codeigniter-extending-the-native-model-and-make-it-your-own.html


或者您可以打开model.php文件(在system/libraries/中)。您绝对不应该修改除应用程序文件夹以外的任何文件。CodeIgniter最好的功能之一是能够将应用程序文件夹拖放到较新版本的CI中(尝试在Symfony中升级它很痛苦)。如果您在system/libraries中修改了某些内容,则在升级时可能会错过某些错误。 - Ken Struys
我知道如果你修改了文件,在升级时可能会很麻烦,但那是创建自己的类的一种方法。另一个方法,也是正确的方法,正如上面的答案所指出的那样,是通过它的本地扩展功能来实现的。 - zz1433

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接