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イベントオブジェクト内で変更されるように、値への参照を返す方法はありますか?

私は2つの回避策を作成できますが、どちらも.....まあ、回避策であり、実際にはきれいではありません。

  1. クラスにラップ$inputします。たとえば、Stringvalueメソッドとgetterメソッド、setterメソッドのみを保持するクラスを作成します。

  2. setInputメソッドをに追加しますInputEventが、それでもListener上記の例のように値に割り当てるほどエレガントではありません。

4

3 に答える 3

2

上記のmoonwave99のように、セッターを使用する必要があります。InputEventクラスに、次のメソッドを追加します。

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

または、参照を返すことができます。

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

私はそれが同じように機能するはずだと思います。

于 2013-02-11T23:44:40.967 に答える
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 に答える
0

getInput関数を参照して返すようにします

function &getInput()
         ^-- signifies return value by reference
于 2013-02-11T23:45:57.687 に答える