LoginSignup
7
7

More than 5 years have passed since last update.

publicでないメソッドをクラス外から実行する

Posted at

PHPはReflectionMethodを使うと、publicでないメソッドをクラス外から実行できるようになります。
protectedやprivateメソッドのテストコードを書きたいときに使えます。

次のsampleMethodのユニットテストを書く例です。

SampleClass.php
namespace SampleNamespace;

class SampleClass {
    private function sampleMethod() {
        return true;
    }
}

ReflectionMethodのコンストラクタ引数で対象クラスとメソッドを指定。
setAccessible(true)でアクセス可能になり、invokeで実行できます。

SampleClassTest.php
require_once('SampleClass.php');

class SampleClassTest extends PHPUnit_Framework_TestCase {

    public function test_sample() {
        $sample = new \SampleNamespace\SampleClass();
        $reflection_method = new ReflectionMethod('SampleNamespace\SampleClass', 'sampleMethod');
        $reflection_method->setAccessible(true);
        $this->assertTrue($reflection_method->invoke($sample));
    }
}

setAccessibleメソッドのドキュメントが参考になりました。
http://jp.php.net/manual/ja/reflectionmethod.setaccessible.php

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7