by shigemk2

当面は技術的なことしか書かない

リフレクション その3 参照渡しのprivateメソッドを実行する

前回
リフレクション その2 引数つきのprivateメソッドを実行する - by shigemk2

リフレクションネタでいいかげんしつこいかもしれません。
参照渡しのメソッドって、どのように実行したらよいのでしょう。

一応、前回と同じような感じで実行してみる。

<?php
class Hoge {
  // 参照渡しの関数になっています。
  private function aaa(&$a) {
    $b = '書いたな';
    $a = $b . $a;
  }

}

$method = new ReflectionMethod('Hoge', 'aaa');
$method->setAccessible(true);
// 実行する
$a = 'コイツ';
$method->invoke(new Hoge, $a);
print_r($a);

すると、こうなる。

PHP Warning: Parameter 1 to Hoge::aaa() expected to be a reference, value given

で、参照渡しのメソッドを実行するときは、invokeに&をつければよい。

<?php
class Hoge {

  private function aaa(&$a) {
    $b = '書いたな';
    $a = $b . $a;
  }

}

$method = new ReflectionMethod('Hoge', 'aaa');
$method->setAccessible(true);
// 実行する
$a = 'コイツ';
print_r($a); // コイツ

// このようにしたらよい
$method->invoke(new Hoge, &$a);
print_r($a); // 書いたなコイツ