2010-07-26 9 views
3

J'ai utilisé Codeigniter pour construire la partie frontale d'une application de taille moyenne, et j'ai rencontré un problème avec - ce que je pense être - l'héritage dans PHP. Voici ce que j'essaie de faire:Codeigniter et héritage multiple

En suivant l'architecture MVC, j'ai trouvé que je dupliquais beaucoup de code à travers les modèles, et j'ai décidé de créer un modèle commun dont les autres modèles pourraient hériter. Assez simple. Cependant, maintenant, je rencontre des problèmes avec certaines des fonctions qui sont définies dans la classe Model commun.

Voici une esquisse de ce que je fais:

<?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(); 
    } 
    } 
} 

?> 

Voici la sous-classe:

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

Y at-il un problème en utilisant l'héritage multiple dans CodeIgniter? Je suis assez nouveau pour PHP et codeigniter.

Merci de votre visite.

+1

J'ai fait exactement ce genre de chose dans le codeigniter et cela n'a jamais causé de problème. Il peut s'agir d'un problème avec la logique de getDeviceInfo ... Les conventions de l'idée aléatoire/mes conventions appellent getDeviceInfo comme $ this-> getDeviceInto au lieu d'utiliser la référence parent et au lieu d'utiliser array_push, utilisez arrCmds [] = $ cmds; –

Répondre

0

Je ne vois pas où se trouve l'héritage multiple.

Je travaille également avec codeigniter, et j'ai eu besoin de sous-classer son contrôleur pour que tous mes contrôleurs puissent descendre directement de la mienne et non de celle de CodeIgniter. CodeIgniter possède des méthodes natives pour étendre ses classes avec les vôtres. Ou vous pouvez ouvrir le fichier model.php (dans le système/bibliothèques /) et en haut du fichier, juste après la if (!defined ...), vous pouvez ajouter le code de votre ManageModel classe

Aussi voici un lien pour l'extension du modèle http://www.askaboutphp.com/50/codeigniter-extending-the-native-model-and-make-it-your-own.html

+0

"Ou vous pouvez ouvrir le fichier model.php (dans system/libraries /)" Vous ne devez JAMAIS JAMAIS modifier les fichiers dans un dossier autre que le dossier de l'application. Une des meilleures caractéristiques de codeigniter est la possibilité de glisser-déposer pour le dossier de l'application dans les versions plus récentes de ci (essayez de mettre à jour dans symfony c'est une douleur). Si vous modifiez quelque chose dans le système/les bibliothèques, vous risquez de manquer un bug lors de la mise à niveau. –

+0

Je sais que si vous avez des fichiers modifiés, cela peut être un problème lors de la mise à niveau, mais c'est une méthode de création de vos propres classes. L'autre, qui est également la bonne façon de le faire, comme indiqué dans la réponse ci-dessus est à travers ses capacités étendues natives – zz1433