클래스 객체 디버그할때 중요정보 보지지 않게 하는 방법
여기서의 예는 데이터베이스 접근을위한 정보를 생성자에 넣어주는데 이것이 디버깅할때 보이는 문제를 해결 하기 위한 것입니다.
결론부터 말하면 디버그용 매직메소드를 사용하면 됩니다.
print_r() 같은 것으로 디버깅하기 위해서 화면 출력을 하면 private의 변수 값이 출력 되는데 이를 방지 하기 위한 예를 들면 다음과 같습니다.
class MysqliDatabase
{
private $masterInfo = ['password' => 'secret123'];
private $mode = 'master';
public function __construct($aMasterInfo)
{
$this->masterInfo = $aMasterInfo;
}
public function __debugInfo()
{
return [
'mode' => $this->mode,
'master' => '***PROTECTED***'
];
}
}
$aMasterInfo = [
'host' => 'localhost',
'user' => 'root',
'dbname' => 'test',
'password' => 'secret123'
];
$db = new MysqliDatabase($aMasterInfo);
print_r($db);
var_dump($db);
재연결이 필요해서 연결정보를 가지고 있는데 재연결이 필요한 경우가 아니라면 연결 정보 자체를 가지고 있을 필요는 없습니다.
반드시 연결정보를 가지고 있어야 한다면 한번 암호화 시켜서 저장하는 방식도 사용하곤 합니다.
물론 복호화가 필요하기 때문에 키를 가지고 있는데 뭔 소용이나 하겠지만 한단계를 거치게 되는것으로 필요 합니다.
일반 웹사이트에서는 재연결을 할 필요가 사실상 없는 경우가 많기 때문에 연결 정보 자체를 가지고 있을 필요가 없으며 장기간 사용해서 재연결을 해야 될 경우등 특수한 경우를 위한 파리미터를 받아 필요시에만 정보를 저장하는 방법도 좋습니다.
* 영향을 받는 함수들
print_r()
var_dump()
var_export()
단순히 디버깅할때 숨기기 위한것이지 접근이 안되고 그런것은 당연히 아닙니다.
$reflection = new ReflectionClass($db);
$property = $reflection->getProperty('masterDbInfo');
$property->setAccessible(true);
echo $property->getValue($db);
