访问属性时调用函数(PHP魔术方法)

时间:2014-12-16 12:35:37

标签: php magic-methods

基本上我使用PHP重载来创建动态方法和属性。我想要做的是触发属性访问的功能,但保持对其方法的访问。

换句话说,这是我的PHP代码:

头等舱:

class _class {
    private $_instance;

    public function __construct() {
        $this->_instance = new _object();
    }

    public function __get($name) {
        switch ($name) {
            case "instance":
                //LOGICS
                break;
        }
        return null;
    }
}

第二课程:

class _object {
    public function __call($method, $args) {
        switch ($method) {
            case "method":
                //LOGICS
            break;
        }
        return null;
    }
}

现在我想以这种方式访问​​对象属性时执行一个函数:

$obj = new _class();
echo $obj->instance; //some output here, executing a function
echo $obj->instance->method(); //different output, executing the method of the instance

谢谢,非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

当您实例化第一个类时,则创建$this->_instance而不是$obj->instanceSo $obj->instance将为null,并且无法对此进行任何调用。

但是,如果你尝试$obj->_instance->method();,那也会很糟糕,因为_instance是私有的。所以你需要添加getter。试试这个:

class _class {

    private $_instance;

    public function __construct() {
        $this->_instance = new _object();
    }

    public function __get($name) {
        switch ($name) {
            case "instance":
                echo "Instance";
                break;
        }
        return null;
    }

    public function getInstance() {
        return $this->_instance;
    }

}

class _object {

    public function __call($method, $args) {
        switch ($method) {
            case "method":
                echo "Method";
                break;
        }
        return null;
    }

}

$obj = new _class();
$obj->instance; 
$obj->getInstance()->method();

输出是:

Instance
Method