2010-08-05 2 views
0

J'essaie de charger une entité avec quelques détails et il y a un resellerId dans l'entité.Php variables de superclasse d'héritage

Maintenant, je hérite d'une sous-classe de celui-ci, et essayer d'accéder à la ResellerId mais il n'est pas là. Comment passer les attributs aux sous-classes? J'en ai vraiment besoin chargé.

Merci!

modifier:

class Crm_Entity extends Crm_Abstract { 

    protected $_mapper = 'Crm_Mapper_Entity'; 
    protected $_data = array(
     'customerId'   => '',  //done 
     'displayName'   => '',  //done 
     'active'    => '',  //done 
     'billingMethod'   => '',  //done 
     'debitorNumber'   => null, //done 
     'bankAccount'   => null, //done 
     'bankAccountTown'  => null, //done 
     'resellerOrganisationId'=> null, 
     'account'    => null, //done 
     'phonenumbers'   => null, //done 
     'calls'     => null, 
     'tickets'    => null, 
     'comments'    => null, 
     'addresses'    => null, 
     'emailaddresses'  => null, //done 
     'actionevents'   => null 
    ); 
} 

class Crm_CustomerEntity extends Crm_Entity { 
    //foobar not done yet 
} 

class Crm_Person extends Crm_CustomerEntity { 

    protected $_data = array(
     'customerId' => null, 
     'firstName'  => '', 
     'middleName' => '', 
     'lastName'  => '', 
     'initials'  => '', 
     'title'   => '', 
     'openingWord' => '' 
    ); 
} 

donc je dois obtenir le resellerId transmis à la sous-classe.

+0

S'il vous plaît montrer du code, sinon il est vraiment difficile de dire quoi que ce soit. – enricog

+0

Pouvez-vous donner plus de détails? Ajoutez des fragments de définition de classe pour définir la classe, la propriété et la sous-classe. accéder à la propriété. –

+0

Ajout d'un peu de code, peut-être que je fais quelque chose de vraiment stupide ... – baklap

Répondre

3

Ok, cela est clair maintenant.

Vous stockez des données dans Arry associative. ET vous redéfinissez ce tableau dans la sous-classe. Bien sûr, il n'aura pas de valeurs de superclasse de cette façon. Déplacez la définition de tableau vers le constructeur de classe à la place. Ensuite, vous devriez avoir

<?php 
class Crm_Entity extends Crm_Abstract 
{ 

    protected $_mapper = 'Crm_Mapper_Entity'; 

    protected $_data; 

    public function __construct() 
    { 
     parent::__construct(); 
     $newData = array(
      'customerId'   => '',  //done 
      'displayName'   => '',  //done 
      'active'    => '',  //done 
      'billingMethod'   => '',  //done 
      'debitorNumber'   => null, //done 
      'bankAccount'   => null, //done 
      'bankAccountTown'  => null, //done 
      'resellerOrganisationId'=> null, 
      'account'    => null, //done 
      'phonenumbers'   => null, //done 
      'calls'     => null, 
      'tickets'    => null, 
      'comments'    => null, 
      'addresses'    => null, 
      'emailaddresses'  => null, //done 
      'actionevents'   => null 
     ); 
     $this->_data = $newData; 
    } 
} 

class Crm_CustomerEntity extends Crm_Entity 
{ 
    //foobar not done yet 
    public function __construct() 
    { 
     parent::__construct(); 
    } 
} 

class Crm_Person extends Crm_CustomerEntity 
{ 
    public function __construct() 
    { 
     parent::__construct(); 

     $newData = array(
      'customerId' => null, 
      'firstName'  => '', 
      'middleName' => '', 
      'lastName'  => '', 
      'initials'  => '', 
      'title'   => '', 
      'openingWord' => '' 
     ); 
     $this->_data = array_merge($this->_data, $newData); 
    } 
} 

Bien sûr, la conception réelle dépend - si vous voulez que ces correspondances avant vous créez la classe, vous devez les mettre dans une fonction statique à la place. Quelque chose comme

class Crm_Person extends Crm_CustomerEntity 
{ 
    public static function getData() 
    { 
     $data = Crm_Entity::getData() 
     $newData = (...) 
     return array_merge($data, $newData); 
    } 
} 
1

Une variable publique ou protégée de la classe parente doit être accessible aux enfants qui en héritent, les variables privées ne sont pas accessibles. Si la propriété est publique ou privée et que vous ne pouvez toujours pas l'atteindre, plus d'informations/le code réel est requis.

2

Votre question n'est pas vraiment facile à comprendre, mais je vérifierais la portée de vos propriétés de classe. Par exemple:

class BaseClass { 

    protected $resellerId; 

    public function setResellerId($resellerId) { 
     $this->resellerId = $resellerId; 
    } 
    public function getResellerId() { 
     return $this->resellerId; 
    } 

    // rest of class code here 
} 

class ChildClass extends BaseClass { 
    // class contents 
} 

$obj = new ChildClass; 
$obj->setResellerId(326); 
echo $obj->getResellerId(); // should print '326' to your page 

Le mot-clé protected rend votre propriété $resellerId disponible dans cette classe, et tous les sous-classes. De plus, les classes publiques deviennent disponibles dans les classes qui étendent la classe dans laquelle elles sont définies, donc je peux les utiliser dans mon ChildClass pour accéder à la propriété $resellerId, qui est également disponible dans mon ChildClass.

0

Il n'y a pas de valeur clé resellerOrganisationId dans le tableau $ _data pour une instance de Crm_Person car le tableau $ _data entier de la classe grand-parent Crm_Entity est substitué par l'héritage. Tout ce que vous avez est le tableau $ _data tel que défini dans la classe Crm_Person.

EDIT

class Crm_Entity { 

    protected $_mapper = 'Crm_Mapper_Entity'; 
    protected $_data = array(
     'customerId'   => '',  //done 
     'displayName'   => '',  //done 
     'active'    => '',  //done 
     'billingMethod'   => '',  //done 
     'debitorNumber'   => null, //done 
     'bankAccount'   => null, //done 
     'bankAccountTown'  => null, //done 
     'resellerOrganisationId'=> null, 
     'account'    => null, //done 
     'phonenumbers'   => null, //done 
     'calls'     => null, 
     'tickets'    => null, 
     'comments'    => null, 
     'addresses'    => null, 
     'emailaddresses'  => null, //done 
     'actionevents'   => null 
    ); 

} 

class Crm_CustomerEntity extends Crm_Entity { 
    //foobar not done yet 
} 

class Crm_Person extends Crm_CustomerEntity { 

    public function __construct() { 
     $this->_data['customerId'] = null; 
     $this->_data['firstName']  = ''; 
     $this->_data['middleName'] = ''; 
     $this->_data['lastName']  = ''; 
     $this->_data['initials']  = ''; 
     $this->_data['title']   = ''; 
     $this->_data['openingWord'] = ''; 
    } 

    public function getData() { 
     return $this->_data; 
    } 
} 


$test = new Crm_Person(); 
var_dump($test->getdata()); 
+0

Hmm donc je dois array_push les nouvelles valeurs au parent $ _data dans le constructeur? – baklap

+0

Correct. PHP ne fusionne pas automatiquement les attributs de tableau ayant le même nom d'attribut sur un héritage. Vous devez le faire grâce au code –

+0

Ah super, merci pour votre aide! – baklap