I’m trying to access protected variables in a second-child class extended from its parent, but every time I try to access them, they are NULL.
What’s weird to me is that I can access the parent’s protected functions without a problem (eg. $this->_submit in the second child class.) I checked the parent class and the variable are set there, so I’m sure it’s something dumb I am missing (still learning OOP). Maybe something to do with the constructor? But if I call parent::__construct() in the second child, it throws an error because the config details are missing?
Parent
<?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');
}
}
?>
First Child
<?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
?>
Second Child
<?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
?>
Calling the code with Rimage::instance($config,'job')->get('12345');
Edit:
The error I’m getting is that $_client is NULL in the child, but not in the parent… $_caller is NULL in the second child.
Cheers and merry christmas!
The __construct() function is not inherited to subclasses, so there is no reason for
$this->_callerto be set in the second child class. To execute the __construct function of the parent, you need to invokeparent::__construct()in the __constructor of the child.