クラス内部で$_SESSION
を使う場合はよくある。ただし、$_SESSION
をそのまま使うとPHPUnitなどのテストの時に面倒くさいという問題があって、何か良い解決法はないかと調べているところ。
正しい方法は、セッションをラップするクラスを作って、それをインジェクトする方法。テストの場合は、別のモックをインジェクトする。
この方法が正しいのだろうけど、ちょっとしたクラスを作る場合にもっと簡単な方法がないのか考えて、こんな方法を使ってみることにした。
class NeedTest {
protected $session;
function __construct(&$session=null) {
if( $session ) {
$this->session = &$session;
} else {
$this->session = &$_SESSION;
}
}
}
「セッションをラップしたクラス」の代わりに配列をインジェクトしているだけだけど。
普通に使う場合は、普通にコンストラクトすると、普通にセッションを使う。
session_start();
$prod = new NeedTest();
テストでは配列を渡してあげる。
class NeedTestTest extends PHPUnit... {
var $need;
var $session=[];
function setup() {
$this->need = new NeedTest( $this->session );
}
}
すると、セッションとして受け渡しがテストのコードから自由に可能になるので便利。テストするぶんには十分だった。
メリットはコードが簡単で依存するオブジェクトがないところか。
今どき参照使うのかというのが最初の疑問で、PHPの正しい構文だけれど、何かPHP4時代の香りがするのがマイナス。
最大の欠点は、オブジェクトをシリアライズして保存するような場合。オブジェクトをアンシリアライズすると、$this->session
の参照が壊れてしまう。こうなると、最新のセッションの値を受け取ることは出来ないし、また書き込んでもセッションに反映されない。