在PHP中访问受保护的变量

时间:2011-12-25 03:13:04

标签: php oop visibility

我正在尝试访问从其父级扩展的第二个子类中的受保护变量,但每次尝试访问它们时,它们都是NULL。

对我来说奇怪的是我可以毫无问题地访问父节点的受保护函数(例如,在第二个子类中使用$this->_submit。)我检查了父类,并在那里设置了变量,所以我是确定这是我失踪的东西(仍在学习OOP)。也许与构造函数有关?但是,如果我在第二个孩子中调用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 个答案:

答案 0 :(得分:2)

__construct()函数不会继承到子类,因此没有理由在第二个子类中设置$this->_caller。要执行父级的__construct函数,需要在子级的__constructor中调用parent::__construct()

答案 1 :(得分:0)

构造new Rimage_Job_Status时,执行Rimage_Job_Status::__construct函数。它唯一能做的就是调用Rimage_Job_Status::_retrieve()。在Rimage_Job_Status::_retrieve中,您尝试访问$this->_caller。但这不存在,因为它没有在我刚才描述的步骤中设置。

说实话,这是使用对象和类的混乱方式。我建议完全重写/重新考虑你在这里要做的事情。