Переменные суперкласса наследования Php - PullRequest
0 голосов
/ 05 августа 2010

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

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

Спасибо!

edit:

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 подклассу.

Ответы [ 4 ]

3 голосов
/ 05 августа 2010

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

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

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

<?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);
    }
}
2 голосов
/ 05 августа 2010

Ваш вопрос не очень прост для понимания, но я бы проверил область действия свойств вашего класса. Например:

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.

1 голос
/ 05 августа 2010

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

0 голосов
/ 05 августа 2010

В массиве $ _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());
...