ハマった!PHP疑似変数「$this」の謎 | tazunのブログ

ハマった!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をとると、、、

原因解明!!

オレは馬鹿だ!という結論。

確かに、、これじゃ検索しても原因がわからないはずだよ。

長い週末だった。。。