2

我有一个看起来像这样的事件对象:

class InputEvent
{
    protected $input;

    public function __construct(&$input)
    {
        $this->input = &$input;
    }

    public function getInput()
    {
         return $this->input;
    }
}

现在,既然$input是一个字符串,我必须通过引用传递它。但是,当我创建事件侦听器时,输入值不会改变,因为getInput函数返回$input值而不是对$input属性的引用。

class Listener
{
    public function myEvent(InputEvent $event)
    {
         $input = $event->getInput();

         // doesn't change InputEvent::input property
         $input = "asd";
    }
}

有没有办法让我返回对$input值的引用,以便它在事件对象内部发生变化?

我可以做两种解决方法,但两者都是......嗯,解决方法,不是很漂亮。

  1. 封装$input到一个类中,例如创建一个String只包含 value 和 getter、setter 方法的类。

  2. setInput方法添加到InputEvent,但仍然不如将其分配给Listener上面示例中的值那么优雅。

4

3 回答 3

2

正如上面提到的moonwave99,您需要使用setter。在您的 InputEvent 类中添加方法:

public function setInput(&$s) {
    $this->input = $s;
}

或者您可以返回参考:

public function &getInputRef() {
    return $this->input;
}
$input = &$event->getInputRef();

我认为应该是一样的。

于 2013-02-11T23:44:40.967 回答
0

让您的 getInput 函数通过引用返回

function &getInput()
         ^-- signifies return value by reference
于 2013-02-11T23:45:57.687 回答
0
class InputEvent
{
    protected $input;

    public function __construct(&$input)
    {
        $this->input = $input;
    }

    public function &getInput()
    {
        return $this->input;
    }
}
$string = "abc";
$a = new InputEvent($string);

$input = &$a->getInput();

$input .= "def";

echo $a->getInput();
于 2013-02-11T23:53:53.963 回答