16
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

$_SESSIONを使うクラスのテストについて

Posted at

クラス内部で$_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の参照が壊れてしまう。こうなると、最新のセッションの値を受け取ることは出来ないし、また書き込んでもセッションに反映されない。

16
14
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
16
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?