2010-08-05 3 views
0

Я пытаюсь загрузить объект с некоторыми подробностями, и в объекте есть реселлер.Переменные суперкласса наследования php

Теперь я наследую подкласс от него и пытаюсь получить доступ к реселлеру, но его там нет. Как передать атрибуты в подклассы? Мне действительно нужно это загрузить.

Спасибо!

редактировать:

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' => '' 
    ); 
} 

Так что мне нужно, чтобы получить resellerId перешел к подклассу.

+0

Пожалуйста, покажите код, иначе это действительно сложно сказать. – enricog

+0

Можете ли вы дать более подробную информацию? Добавьте фрагменты определения класса, ответственные за определение класса, свойства, подкласса; доступ к собственности. –

+0

Добавлен код, возможно, я делаю что-то действительно глупое ... – baklap

ответ

3

Хорошо, это теперь ясно.

Вы храните данные в ассоциативном режиме. И вы переопределяете этот массив в подклассе. Конечно, у него не будет значений, представляющих суперкласс таким образом.

Вместо этого переместите определение массива в конструктор классов. Тогда вы должны иметь

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

Конечно фактическая конструкция зависит - если вы хотите, чтобы эти отображения перед тем создать класс, который вы должны поместить их в какой-то статической функции вместо этого. Что-то вроде

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

Публичная или защищенная переменная из родительского класса должна быть доступна дочерью, наследующей от нее, частные переменные недоступны. Если это свойство является общедоступным или приватным, и вы все еще не можете его достичь, вам потребуется дополнительная информация/фактический код.

2

Ваш вопрос не так-то просто понять, но я бы проверял сферу ваших свойств класса. Например:

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 

protected ключевое слово делает ваше $resellerId свойство доступно в этом классе, и все подклассы. Кроме того, публичные классы становятся доступными в классах, расширяющих класс, в котором они определены, поэтому я могу использовать их в своем ChildClass для доступа к свойству $resellerId, которое также доступно в моем ChildClass.

0

В массиве $ _data для экземпляра Crm_Person нет ключевого значения resellerOrganisationId, потому что весь массив $ _data в классе родительского класса Crm_Entity переопределяется наследованием. Все, что у вас есть, - это массив $ _data, определенный в классе 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

Хм, так мне нужно массировать новые значения родительскому $ _data в конструкторе? – baklap

+0

Исправить. PHP не автоматически объединяет атрибуты массива, которые имеют одно и то же имя атрибута в наследовании. Вы должны сделать это с помощью кода –

+0

Ах, спасибо, за вашу помощь! – baklap

Смежные вопросы