2010-07-26 5 views
3

저는 Codeigniter를 사용하여 적당한 크기의 응용 프로그램의 프론트 엔드를 구성했으며 PHP의 상속과 관련된 문제가 발생했습니다. 여기에 내가 뭘하려고하는지 알 수있다 :Codeigniter 및 다중 상속

MVC 아키텍처를 따랐을 때 모델을 통해 많은 코드를 복제하고 다른 모델에서 상속받을 수있는 공통 모델을 만들기로 결정했다. 충분히 간단합니다. 그러나 이제는 공통 Model 클래스에 정의 된 일부 기능에 문제가 있습니다.

<?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 

/** 
* 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와 codeigniter에 대해 상당히 새로운 것이다.

감사합니다.

+1

저는 codeigniter에서 이런 종류의 작업을 수행 했으므로 결코 문제가 발생하지 않습니다. 그것은 getDeviceInfo의 로직 문제 일 수 있습니다 ... 몇 가지 무작위 아이디어/내 규칙은 부모 참조를 사용하는 대신 getDeviceInfo를 $ this-> getDeviceInto로 호출하고 대신 array_push를 사용합니다. arrCmds [] = $ cmds; –

답변

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

+0

"또는 system/libraries /에있는 model.php 파일을 열 수 있습니다."응용 프로그램 폴더 이외의 다른 파일은 절대로 수정하면 안됩니다. codeigniter의 가장 큰 특징 중 하나는 응용 프로그램 폴더를 새로운 버전의 ci로 드래그 앤 드롭 할 수 있다는 것입니다 (symfony에서 업그레이드를 시도해보십시오). 시스템/라이브러리에서 무언가를 수정하면 업그레이드 할 때 버그가 누락 될 수 있습니다. –

+0

파일을 수정 한 경우 업그레이드 할 때 번거로운 일이 발생할 수 있지만 고유 한 클래스를 만드는 방법 중 하나라는 것을 알고 있습니다. 위의 대답에서 언급 한 것처럼 적절한 방법이기도 한 다른 하나는 네이티브 확장 기능입니다. – zz1433