非静态地从另一个类调用类和方法

时间:2014-01-10 19:39:44

标签: php

我正在尝试从另一个类中实例化PHP中的类,以及调用所述类的方法,但无论我做什么,我都会收到错误。

为什么以下不起作用:

class Example {
    public function sayHi () {
        echo "hi";
    }
}

class Caller {
    private $_controller,
            $_action;

    public function __construct ($cont, $action) {
        $this->_controller = $cont;
        $this->_action = $action;
    }

    public function __toString() {
        return (string)$this->_action;
    }

    public function run () {
        $controller = new $this->_controller;
        if (is_callable(array($controller, $this->_action))) {
            $controller->$this->_action;
        }
    }
}

$caller = new Caller ('Example', 'sayHi');
$caller->run();

将方法运行更改为以下作品?

public function run () {
    $controller = new $this->_controller;
    if (is_callable(array($controller, $this->_action))) {
        call_user_func(array($this->_controller, $this->_action));
    }
}

我不想要call_user_func的原因是因为它静态调用控制器。

删除魔术方法__toString给了我:

Catchable fatal error: Object of class Caller could not be converted to string

再次添加它会给我以下内容:

Undefined property: Example::$sayHi (same line, on method run() from Caller)
Trying to get property of non-object (same line, on method run() from Caller)

2 个答案:

答案 0 :(得分:4)

这一行是你的问题:

$controller->$this->_action;

这里有几个问题。首先,你最后没有表示你正在调用方法的parens。 PHP认为您正在尝试访问属性。

其次,您希望首先获取$this->_action的值,然后将该值动态地用作方法名称。使用花括号将其分开。

将该行更改为:

$controller->{$this->_action}();

它有效:http://3v4l.org/2B0qg

答案 1 :(得分:2)

你是对的。如果您只是将类名称和函数传递给call_user_func,它将静态调用它。但是如果你将一个实例传递给它,它将在该实例中调用它。这就是callable的原因。