ハマった!PHP疑似変数「$this」の謎
事象にでくわした時の図(←キタナイ)
事象:コンストラクタでメンバに値を設定するが、直接設定する場合とセッターで設定する場合で「設定先」が異なる!?
よくでてくる擬似変数$thisの仕様なのか、コンストラクタ特有の動きなのか?
ちょいプログラム作って確認するが事象は再現されない。
Eclipseデバッガーの不具合かと思ったが、継続して調べて行くと、、
・要点を切りだしたソースを別のサーバ環境で直接動かしても事象は再現される
・[リファクタリング]-[名前変更]でクラスメンバの名前を変更すると、直接設定している部分だけ変更されない
別のサーバ環境で確認したソース
class Base {
/**
*
*/public function doTest()
{
$myBSSession = new BSSession('test2', 3333, 4444);
return $myBSSession;
}
}
class BSSession {
//////// 稼働中のセッション名
private $sessionName;
//////// 稼働中セッションの開始日時
public $sessionStartDTime;
//////// 稼働中セッションの終了日時
public $sessionEndDTime;
/**
*
* コンストラクタ
*
*/
public function __construct(String $theSessionName, int $theSessionStartDtime, int $theSessionEndDtime)
{
$tSet = isset($this);
$tIns = get_class($this);
//////// 稼働中のセッション名
$this->setSessionName($theSessionName);
$this->sessionName = $theSessionName;
//////// 稼働中セッションの開始日時
$this->setSessionStartDTime($theSessionStartDtime);
$this->sessionStartDtime = $theSessionStartDtime;
//////// 稼働中セッションの終了日時
$this->setSessionEndDTime($theSessionEndDtime);
$this->sessionEndDtime = $theSessionEndDtime;
$testValue1 = $this->getSessionEndDTime();
$testValue2 = $this->sessionEndDtime;
}
/**
* @return String 稼働中のセッション名
*/
public function getSessionName()
{
return $this->sessionName;
}
/**
* @return number 稼働中セッションの開始日時
*/
public function getSessionStartDTime()
{
return $this->sessionStartDTime;
}
/**
* @return number 稼働中セッションの終了日時
*/
public function getSessionEndDTime()
{
return $this->sessionEndDTime;
}
/**
* @param String $sessionName 稼働中のセッション名
*/
public function setSessionName($sessionName)
{
$this->sessionName = $sessionName;
}
/**
* @param number $sessionStartDTime 稼働中セッションの開始日時
*/
public function setSessionStartDTime($sessionStartDTime)
{
$this->sessionStartDTime = $sessionStartDTime * 2;
}
/**
* @param number $sessionEndDTime 稼働中セッションの終了日時
*/
public function setSessionEndDTime(int $sessionEndDTime)
{
$this->sessionEndDTime = $sessionEndDTime * 2;
}
}
$myBase = new Base();
$myBSSession = $myBase->doTest();
echo $myBSSession->getSessionEndDTime().'<br>';
echo $myBSSession->sessionEndDtime.'<br>';
その結果
名前変更に追いてこないということは、コード上は別のものと認識していることになる。
この部分を手修正すると、なんと!想定通りの動きになる。
ここまで追い込めばゴール近そう?(Eclipe環境を離れて「別のサーバ環境」で確認中)
バックアップを取りながら「想定通りの動きに」まで辿りついたソースでDFをとると、、、
原因解明!!
オレは馬鹿だ!という結論。
確かに、、これじゃ検索しても原因がわからないはずだよ。
長い週末だった。。。