せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【PHP】そんなことまで出来ちゃうの!? private,protectedが見たい編

Unitテストでお決まりの「テスト対象クラスのprivate,protectedが見たい」欲。
Javaだったらリフレクション一択ですが、スクリプト言語PHPならなにかズルがあるに違いないと思い検索。
見つけました(※2)。やっぱあるんだー。さすがー。やばいー。
 #PHPでもリフレクション使っている方法もあったけれども(※1)。

■テスト対象(抜粋)

<?php
class ClassLoader
{
	protected $dirs;
	public function registerDir($dir)
	{
		$this->dirs[] = $dir;
	}
}

private な変数は $array["\0クラス名\0変数名"]
protected な変数は $array["\0*\0変数名"] でアクセス可能に!

■テストコード

<?php
require_once 'PHPUnit/Autoload.php';
require_once dirname(__FILE__). '/../../core/ClassLoader.php';

class ClassLoaderTest extends PHPUnit_Framework_TestCase
{
	public function setUp()
	{
	    $this->classLoader = new ClassLoader;
	}
	
	public function test_registerDir()
	{
		$dir ="test";
		$this->classLoader->registerDir($dir);
		$result = (array)$this->classLoader;
		$this->assertEquals("test", $result["\0*\0dirs"][0]);
	}	
}

API化すればもっとシンプルにかけそう。
private も赤裸々に見えちゃうとは。すごいなー。


※1:PHPUnit + Selenium で撮れるスクリーンショットのファイル名を任意に設定する
http://gongo.hatenablog.com/entry/2012/05/29/143613

※2:PHPでprivateな変数を外部から参照するには
http://www.psi-net.co.jp/blog/?p=302