Доступ к защищенным переменным в PHP - PullRequest
1 голос
/ 25 декабря 2011

Я пытаюсь получить доступ к защищенным переменным в классе второго ребенка, расширенном от его родителя, но каждый раз, когда я пытаюсь получить к ним доступ, они имеют значение NULL.

Что странно для меня, так это то, что я могу получить доступ к защищенным функциям родителя без проблем (например, $this->_submit во втором дочернем классе.) Я проверил, что родительский класс и переменная установлены там, поэтому я 'я уверен, что это что-то глупое, что я пропускаю (все еще изучаю ООП).Может быть, что-то делать с конструктором?Но если я вызываю parent::__construct() во втором дочернем элементе, выдается ошибка, поскольку отсутствуют сведения config?

Родительский

<?php defined('SYSPATH') or die('No direct script access.');
abstract class Rimage {

    protected $_config;
    protected $_service;
    protected $_client;

public static function instance($config, $service)
{
    return new Rimage_Client($config, $service);
}

public function __construct($config = array(), $service = NULL)
{
    $this->_config  = $config;
    $this->_service = $service;
    $this->_client = new SoapClient('url');
}

}
?>

Первый дочерний элемент

<?php defined('SYSPATH') or die('No direct script access.');

class Rimage_Client extends Rimage {

    protected $_caller;

    public function __construct($config = array(), $service = NULL)
    {
        parent::__construct($config, $service);
        $this->_caller = Arr::get($config, 'caller', array());
    }

    public function get($id = NULL)
    {   
    return new Rimage_Job_Status($id);
    }

    protected function _submit($options, $request_class)
    {
        $job->request = $options;

        $response = $this->_client->$request_class($job); /** Client is undefined??**/
        return $response;   
    }

} // End Rimage_Client
?>

Второй ребенок

<?php defined('SYSPATH') or die('No direct script access.');
class Rimage_Job_Status extends Rimage_Client {

    public function __construct($id) 
    {       
        return $this->_retrieve($id);
    }

    private function _retrieve($id = NULL)
    {
        $options->CallerId  = $this->_caller; /** $_caller is undefined??? **/
        $options->JobId     = $id;

        $response = $this->_submit($options, 'test');
        return $response->whatever;
    }

} // End Rimage_Job_Status
?>

Вызов кода с помощью Rimage::instance($config,'job')->get('12345');

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

Ошибка, которую я получаю, заключается в том, что $_client имеет значение NULL у ребенка, но не в родителе ... $_caller имеет значение NULL у второго ребенка.

Приветствия и счастливого Рождества!

Ответы [ 2 ]

2 голосов
/ 25 декабря 2011

Функция __construct () не наследуется подклассам, поэтому нет необходимости устанавливать $this->_caller во втором дочернем классе. Чтобы выполнить функцию __construct родительского элемента, необходимо вызвать parent::__construct() в конструкторе __ дочернего элемента.

0 голосов
/ 25 декабря 2011

Когда вы создаете new Rimage_Job_Status, выполняется функция Rimage_Job_Status::__construct.Единственное, что он делает, это вызывает Rimage_Job_Status::_retrieve()Rimage_Job_Status::_retrieve вы пытаетесь получить доступ к $this->_caller.Но этого не существует, потому что он не был установлен нигде в шагах, которые я только что описал.

Если честно, это довольно путанный способ использования объектов и классов.Я бы порекомендовал полностью переписать / переосмыслить то, что вы пытаетесь сделать здесь.

...